在jUnit中有多个RunWith语句
我写unit testing,并希望使用JUnitParamsRunner
和MockitoJUnitRunner
一个testing类。
不幸的是,以下不起作用:
@RunWith(MockitoJUnitRunner.class) @RunWith(JUnitParamsRunner.class) public class DatabaseModelTest { // some tests }
有没有办法在一个testing课中同时使用Mockito和JUnitParams?
你不能这样做,因为根据规范,你不能在相同的注释元素两次相同的注释。
那么,解决scheme是什么? 解决的办法是只把一个@RunWith()
和runner放在一起,而用别的replace其他的。 在你的情况下,我想你会删除MockitoJUnitRunner
并以编程方式做它。
事实上,它唯一运行的是:
MockitoAnnotations.initMocks(test);
在testing案例的开始。 所以,最简单的解决方法就是把这个代码放到setUp()
方法中:
@Before public void setUp() { MockitoAnnotations.initMocks(this); }
我不知道,但可能你应该避免多次调用这个方法使用标志:
private boolean mockInitialized = false; @Before public void setUp() { if (!mockInitialized) { MockitoAnnotations.initMocks(this); mockInitialized = true; } }
然而,更好的是,可重复使用的解决scheme可以用JUnt的规则来实现。
public class MockitoRule extends TestWatcher { private boolean mockInitialized = false; @Override protected void starting(Description d) { if (!mockInitialized) { MockitoAnnotations.initMocks(this); mockInitialized = true; } } }
现在只需将以下行添加到testing用例中:
@Rule public MockitoRule mockitoRule = new MockitoRule();
你可以用你想要的任何一个跑步者运行这个testing用例。
从JUnit 4.7和Mockito 1.10.17开始,这个function就是内置的。 有一个org.mockito.junit.MockitoRule
类。 你可以简单地导入它并添加行
@Rule public MockitoRule mockitoRule = MockitoJUnit.rule();
到你的testingclass。
这个解决scheme适用于每一个可能的跑步者,而不仅仅是这个mockito的例子。 例如; 对于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运行。 在调用JUnitCore.runClasses(TestMockitoJUnitRunner.class)
过程中, TestMockitoJUnitRunner
依赖于它(通过逻辑),它将在@Test
方法中运行在main中。 此方法确保主跑步者在运行子跑步者之前正确启动,从而有效地实现具有相关testing类的多个嵌套的@RunWith
注释。
也在https://bekce.github.io/junit-multiple-runwith-dependent-tests
在我的情况下,我试图在春豆和嘲笑一些方法
MockitoAnnotations.initMocks(test);
不起作用。 相反,你必须定义这个bean在你的xml文件中使用mock方法来构造,如下所示。
... <bean id="classWantedToBeMocked" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="com.fullpath.ClassWantedToBeMocked" /> </bean> ...
并在你的testing类里添加这个自动assembly的bean,如下所示。
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="file:springconfig.xml") public class TestClass { ... @Autowired private ClassWantedToBeMocked classWantedToBeMocked; ... when(classWantedToBeMocked.methodWantedToBeMocked()).thenReturn(...); ... }
自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/
你也可以试试这个:
@RunWith(JUnitParamsRunner.class) public class AbstractTestClass { // some tests } @RunWith(MockitoJUnitRunner.class) public class DatabaseModelTest extends AbstractTestClass { // some tests }