単体テストを作成し、1つのテストクラスにJUnitParamsRunner
とMockitoJUnitRunner
を使用したい。
残念ながら、以下は機能しません。
@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
// some tests
}
1つのテストクラスでMockitoとJUnitParamsの両方を使用する方法はありますか?
仕様に従って、同じ注釈付き要素に同じ注釈を2回配置できないため、これを行うことはできません。
それで、解決策は何ですか?解決策は、ランナーが1つだけ@RunWith()
を配置し、他のランナーを他のものに置き換えることです。あなたの場合、MockitoJUnitRunner
を削除し、プログラムが実行することをプログラムで実行すると思います。
実際、それが実行する唯一のこと:
MockitoAnnotations.initMocks(test);
テストケースの始めに。したがって、最も簡単な解決策は、このコードをsetUp()
メソッドに入れることです。
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
よくわかりませんが、おそらくフラグを使用してこのメソッドを何度も呼び出さないでください:
private boolean mockInitialized = false;
@Before
public void setUp() {
if (!mockInitialized) {
MockitoAnnotations.initMocks(this);
mockInitialized = true;
}
}
ただし、JUntのルールを使用して、より良い再利用可能なソリューションを実装できます。
public class MockitoRule extends TestWatcher {
private boolean mockInitialized = false;
@Override
protected void starting(Description d) {
if (!mockInitialized) {
MockitoAnnotations.initMocks(this);
mockInitialized = true;
}
}
}
次に、テストクラスに次の行を追加します。
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
このテストケースを任意のランナーで実行できます。
JUnit 4.7およびMockito 1.10.17以降、この機能は組み込まれています。 org.mockito.junit.MockitoRule
クラスがあります。単にインポートして、行を追加できます
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
テストクラスに。
このソリューションは、このモッキートの例だけでなく、あらゆるランナーに有効です。例えば; Springの場合、ランナークラスを変更し、必要な注釈を追加するだけです。
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
@Test
public void subRunner() throws Exception {
JUnitCore.runClasses(TestMockitoJUnitRunner.class);
}
@RunWith(MockitoJUnitRunner.class)
public static class TestMockitoJUnitRunner {
}
}
DatabaseModelTest
はJUnitによって実行されます。 TestMockitoJUnitRunner
は(ロジックによって)それに依存し、@Test
メソッド内のメインのinsideがJUnitCore.runClasses(TestMockitoJUnitRunner.class)
の呼び出し中に実行されます。このメソッドは、static class TestMockitoJUnitRunner
サブランナーが実行される前にメインランナーが正しく起動されるようにし、複数のネストされた@RunWith
アノテーションを依存テストクラスで効果的に実装します。
https://bekce.github.io/junit-multiple-runwith-dependent-tests
PowerMock 1.6のリリース以降、次のように簡単に実行できます。
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(JUnitParamsRunner.class)
public class DatabaseModelTest {
// some tests
}
ここで説明 https://blog.jayway.com/2014/11/29/using-another-junit-runner-with-powermock/
私の場合、私は春豆でいくつかの方法をモックしようとしていました
MockitoAnnotations.initMocks(test);
動作しません。代わりに、次のように、xmlファイル内でモックメソッドを使用して構築するBeanを定義する必要があります。
...
<bean id="classWantedToBeMocked" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.fullpath.ClassWantedToBeMocked" />
</bean>
...
次のように、テストクラス内に自動配線されたBeanを追加します。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="file:springconfig.xml")
public class TestClass {
...
@Autowired
private ClassWantedToBeMocked classWantedToBeMocked;
...
when(classWantedToBeMocked.methodWantedToBeMocked()).thenReturn(...);
...
}
このリンクをチェックしてください https://bekce.github.io/junit-multiple-runwith-dependent-tests/ このアプローチを使用して、@ RunWith (Parameterized.class)-外側のランナー-with @RunWith(MockitoJUnitRunner.class)-内側のランナー。私が追加しなければならなかった唯一の微調整は、外側のクラス/ランナーのメンバー変数を静的にして、内側/ネストされたランナー/クラスからアクセスできるようにすることでした。幸運をお楽しみください。