@RunWith(MockitoJUnitRunner.class)与MockitoAnnotations.initMocks(this)

当写一个新的jUnit4testing,我想知道是否使用@RunWith(MockitoJUnitRunner.class)MockitoAnnotations.initMocks(this)

我创build了一个新的testing&向导自动生成与亚军testing。 针对MockitoJUnitRunner的Javadoc声明如下:

与JUnit 4.4及更高版本兼容,该跑步者增加了以下行为:

初始化用Mock注释的mock,以便显式使用MockitoAnnotations.initMocks(Object)不是必需的。 在每个testing方法之前,Mock都被初始化。 validation每种testing方法之后的框架使用情况。

我不清楚使用Runner是否比我以前使用的initMocks()方法有优势。

任何想法或链接将不胜感激!

MockitoJUnitRunner给你自动validation框架的使用情况,以及一个自动的initMocks()

框架使用的自动validation实际上是值得的。 如果你犯这些错误之一,它会给你更好的报告。

  • when方法中调用静态方法时,不要使用匹配的thenReturnthenThrowthen完成thenThrow(在下面的代码中的错误1)

  • 您在模拟上调用verify ,但忘记提供您正在validation的方法调用。 (下面代码中的错误2)

  • 您在doReturndoThrowdoAnswer之后调用when方法并传递一个模拟,但忘记提供您正在尝试存根的方法。 (下面的代码中的错误3)

如果您没有validation框架使用情况,直到下面调用Mockito方法才会报告这些错误。 这可能是

  • 在相同的testing方法(如下面的错误1)中,
  • 在下一个testing方法(如下面的错误2)中,
  • 在下一个testingclass。

如果它们出现在你运行的最后一个testing中(如下面的错误3),它们将不会被报告。

以下是每种types的错误的外观。 这里假设JUnit按照这里列出的顺序运行这些testing。

 @Test public void test1() { // ERROR 1 // This compiles and runs, but it's an invalid use of the framework because // Mockito is still waiting to find out what it should do when myMethod is called. // But Mockito can't report it yet, because the call to thenReturn might // be yet to happen. when(myMock.method1()); doSomeTestingStuff(); // ERROR 1 is reported on the following line, even though it's not the line with // the error. verify(myMock).method2(); } @Test public void test2() { doSomeTestingStuff(); // ERROR 2 // This compiles and runs, but it's an invalid use of the framework because // Mockito doesn't know what method call to verify. But Mockito can't report // it yet, because the call to the method that's being verified might // be yet to happen. verify(myMock); } @Test public void test3() { // ERROR 2 is reported on the following line, even though it's not even in // the same test as the error. doReturn("Hello").when(myMock).method1(); // ERROR 3 // This compiles and runs, but it's an invalid use of the framework because // Mockito doesn't know what method call is being stubbed. But Mockito can't // report it yet, because the call to the method that's being stubbed might // be yet to happen. doReturn("World").when(myMock); doSomeTestingStuff(); // ERROR 3 is never reported, because there are no more Mockito calls. } 

现在,当我五年多前写这个答案时,我写道

所以我会build议尽可能使用MockitoJUnitRunner 。 然而,正如Tomasz Nurkiewicz所正确指出的那样,如果您需要另一个JUnit运行程序(如Spring),则无法使用它。

我的build议现在已经改变了。 自从我第一次写这个答案以来,Mockito团队添加了一个新function。 这是一个JUnit规则,它执行与MockitoJUnitRunner完全相同的function。 但是更好,因为它不排除使用其他跑步者。

包括

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

在你的testing课上 这初始化模拟,并自动化框架validation; 就像MockitoJUnitRunner一样。 但是现在,您可以使用SpringJUnit4ClassRunner或任何其他JUnitRunner。 从Mockito 2.1.0开始,还有其他选项可以准确控制报告的问题types。

使用runner可以节省一些编码(不需要使用@Before方法)。 另一方面,使用runner有时是不可能的,也就是说,当你已经在使用SpringJUnit4ClassRunner

而已。 这只是一个偏好问题。