在编写新的jUnit4测试时,我想知道是使用@RunWith(MockitoJUnitRunner.class)
还是MockitoAnnotations.initMocks(this)
。
我创建了一个新测试,并且向导使用Runner自动生成了一个测试。 MockitoJUnitRunner的Javadocs声明以下内容:
我尚不清楚使用Runner是否比我过去使用的initMocks()
方法有任何优势。
最佳答案
MockitoJUnitRunner
为您提供框架使用情况的自动验证,以及自动的initMocks()
。
框架使用的自动验证实际上是值得的。如果您犯了这些错误之一,它可以为您提供更好的报告。
when
方法,但不要使用匹配的thenReturn
,thenThrow
或then
完成存根。 (下面的代码中的错误1)verify
,但是忘记提供方法调用您正在尝试验证。 (下面的代码中的错误2)
when
,doReturn
或doThrow
并传递一个模拟,但是忘记提供该方法您正在尝试存根。 (下面的代码中的错误3)
如果您没有验证框架使用情况,则在以下对Mockito方法的调用之前,不会报告这些错误。这可能是
下一测试类中的
如果它们在您上次运行的测试中发生(如下面的错误3),则根本不会报告它们。
这是每种错误类型的外观。这里假设JUnit按照此处列出的顺序运行这些测试。
@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.
}
现在,五年多以前我第一次写这个答案时,
我的建议现在已更改。自从我第一次写这个答案以来,Mockito团队就增加了一个新功能。这是一个JUnit规则,它执行的功能与
doAnswer
完全相同。但这更好,因为它不排除使用其他运行者。包括
@Rule
public MockitoRule rule = MockitoJUnit.rule();
在您的测试课中。这将初始化模拟,并自动进行框架验证;就像
MockitoJUnitRunner
一样。但是现在,您也可以使用MockitoJUnitRunner
或任何其他JUnitRunner。从Mockito 2.1.0开始,还有其他选项可精确控制要报告的问题类型。关于java - @RunWith(MockitoJUnitRunner.class)vs MockitoAnnotations.initMocks(this),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10806345/