jUnit 中的多个 RunWith 语句

2022-08-31 08:48:50

我编写单元测试,并希望使用和用于一个测试类。JUnitParamsRunnerMockitoJUnitRunner

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

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

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


答案 1

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

那么,解决方案是什么呢?解决方案是只放一个你不能没有的跑步者,并用其他东西代替另一个。在你的情况下,我想你会删除并按照编程方式做它所做的事情。@RunWith()MockitoJUnitRunner

事实上,它唯一做的事情是它运行的:

MockitoAnnotations.initMocks(test);

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

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

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

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();

并且您可以使用所需的任何运行器运行此测试用例。


答案 2

从JUnit 4.7和Mockito 1.10.17开始,此功能是内置的;有一个org.mockito.junit.MockitoRule类。您只需导入它并添加行即可

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

到测试类。


推荐