web-dev-qa-db-ja.com

jUnitの複数のRunWithステートメント

単体テストを作成し、1つのテストクラスにJUnitParamsRunnerMockitoJUnitRunnerを使用したい。

残念ながら、以下は機能しません。

@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
  // some tests
}

1つのテストクラスでMockitoとJUnitParamsの両方を使用する方法はありますか?

97
Hans-Helge

仕様に従って、同じ注釈付き要素に同じ注釈を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();

このテストケースを任意のランナーで実行できます。

97
AlexR

JUnit 4.7およびMockito 1.10.17以降、この機能は組み込まれています。 org.mockito.junit.MockitoRule クラスがあります。単にインポートして、行を追加できます

@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();

テストクラスに。

54
Erica Kane

このソリューションは、このモッキートの例だけでなく、あらゆるランナーに有効です。例えば; 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メソッド内のメインのinsideJUnitCore.runClasses(TestMockitoJUnitRunner.class)の呼び出し中に実行されます。このメソッドは、static class TestMockitoJUnitRunnerサブランナーが実行される前にメインランナーが正しく起動されるようにし、複数のネストされた@RunWithアノテーションを依存テストクラスで効果的に実装します。

https://bekce.github.io/junit-multiple-runwith-dependent-tests

14
bekce

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/

6
lekant

私の場合、私は春豆でいくつかの方法をモックしようとしていました

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(...);
    ...
}
2
Heungwoo

このリンクをチェックしてください https://bekce.github.io/junit-multiple-runwith-dependent-tests/ このアプローチを使用して、@ RunWith (Parameterized.class)-外側のランナー-with @RunWith(MockitoJUnitRunner.class)-内側のランナー。私が追加しなければならなかった唯一の微調整は、外側のクラス/ランナーのメンバー変数を静的にして、内側/ネストされたランナー/クラスからアクセスできるようにすることでした。幸運をお楽しみください。

0
Legna