Han*_*lge 104 java junit unit-testing
我编写单元测试并希望使用JUnitParamsRunner
和MockitoJUnitRunner
一个测试类.
不幸的是,以下不起作用:
@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)
并且您可以使用您想要的任何跑步者运行此测试用例.
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)
到你的考试班.
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
自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/