jUnit中的多个RunWith语句

Han*_*lge 104 java junit unit-testing

我编写单元测试并希望使用JUnitParamsRunnerMockitoJUnitRunner一个测试类.

不幸的是,以下不起作用:

@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
  // some tests
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在一个测试类中同时使用Mockito和JUnitParams?

Ale*_*exR 100

你不能这样做,因为根据规范,你不能在同一个带注释的元素上放两次相同的注释.

那么,解决方案是什么?解决方案是只放一个@RunWith()没有跑步者的跑步者,用其他东西替换其他跑步者.在你的情况下,我猜你会删除MockitoJUnitRunner并以编程方式做它的作用.

事实上它唯一运行的是:

MockitoAnnotations.initMocks(test);
Run Code Online (Sandbox Code Playgroud)

在测试案例的开头.所以,最简单的解决方案是将此代码放入setUp()方法中:

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}
Run Code Online (Sandbox Code Playgroud)

我不确定,但可能你应该避免使用flag多次调用此方法:

private boolean mockInitialized = false;
@Before
public void setUp() {
    if (!mockInitialized) {
        MockitoAnnotations.initMocks(this);
        mockInitialized = true;  
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,可以使用JUnt的规则实现更好的可重用解决方案.

public class MockitoRule extends TestWatcher {
    private boolean mockInitialized = false;

    @Override
    protected void starting(Description d) {
        if (!mockInitialized) {
            MockitoAnnotations.initMocks(this);
            mockInitialized = true;  
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在只需在测试用例中添加以下行:

@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
Run Code Online (Sandbox Code Playgroud)

并且您可以使用您想要的任何跑步者运行此测试用例.

  • 检查`mockInitialized`是错误的.你想为每个tetst做一个新的模拟. (11认同)

Eri*_*ane 54

从JUnit 4.7和Mockito 1.10.17开始,内置了此功能; 有一org.mockito.junit.MockitoRule节课.您只需导入它并添加该行即可

@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
Run Code Online (Sandbox Code Playgroud)

到你的考试班.

  • 对于旧版本的的Mockito(下降到1.10.5看来),你必须使用:`@rule公共MockitoJUnitRule =的Mockito新MockitoJUnitRule(本);` (2认同)

bek*_*kce 15

此解决方案适用于所有可能的跑步者,而不仅仅是这个模拟示例.例如; 对于Spring,只需更改运行器类并添加必要的注释即可.

@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {

    @Test
    public void subRunner() throws Exception {
        JUnitCore.runClasses(TestMockitoJUnitRunner.class);
    }

    @RunWith(MockitoJUnitRunner.class)
    public static class TestMockitoJUnitRunner {
    }
}
Run Code Online (Sandbox Code Playgroud)

DatabaseModelTest将由JUnit运行.TestMockitoJUnitRunner取决于它(通过逻辑),它会运行内部的主要的在一个@Test方法中,通话期间,JUnitCore.runClasses(TestMockitoJUnitRunner.class).此方法可确保在static class TestMockitoJUnitRunner子运行程序运行之前正确启动主运行器,从而有效地实现@RunWith具有依赖测试类的多个嵌套注释.

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

  • 通过在不检查结果的情况下调用`JUnitCore.runClasses()`,您可能会掩盖内部测试中的错误.`assert(JUnitCore.runClasses(TestMockitoJUnitRunner.class).wasSuccessful());`至少会向你报告错误 (3认同)

lek*_*ant 6

自PowerMock 1.6发布以来,您可以轻松实现

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(JUnitParamsRunner.class)
public class DatabaseModelTest {
  // some tests
}
Run Code Online (Sandbox Code Playgroud)

在这里解释https://blog.jayway.com/2014/11/29/using-another-junit-runner-with-powermock/