在jUnit中有多个RunWith语句

我写unit testing,并希望使用JUnitParamsRunnerMockitoJUnitRunner一个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 }