我编写单元测试,并且想对一个测试类使用JUnitParamsRunner
和MockitoJUnitRunner
。
不幸的是,以下操作无效:
@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
// some tests
}
有没有办法在一个测试类中同时使用Mockito和JUnitParams?
最佳答案
您不能执行此操作,因为根据规范,您不能将相同的注释两次放在相同的注释元素上。
那么,解决方案是什么?解决方案是只放一个@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();
您可以与任何所需的运行程序一起运行此测试用例。