在写一个新的jUnit4测试,我想知道是否使用@RunWith(MockitoJUnitRunner.class)或MockitoAnnotations.initMocks(本)。
我创建一个新的测试&向导自动生成与所述转轮的测试。 对于MockitoJUnitRunner的Javadoc声明如下:
使用JUnit 4.4和更高版本兼容,这个亚军增加了以下行为:
初始化用模拟注释嘲笑,让MockitoAnnotations.initMocks(对象)的明确的使用是没有必要的。 嘲笑每个测试方法之前被初始化。 验证每个试验方法后框架的使用。
目前尚不清楚对我使用亚军是否有过initMocks()方法,我一直在使用过去任何优势。
任何想法或链接将不胜感激!
MockitoJUnitRunner
为您提供了框架使用的自动验证,以及自动initMocks()
框架使用的自动验证实际上是值得拥有的。 它可以让你更好的报告,如果你让这些错误之一。
您调用静态when
的方法,但不具有匹配完成磕碰thenReturn
, thenThrow
或then
。 (在下面的代码错误1)
你叫verify
在一个模拟的,但忘了向您提供您尝试验证的方法调用。 (错误2在下面的代码)
您调用when
之后方法doReturn
, doThrow
或doAnswer
并通过一个模拟的,但忘了向您提供您正试图存根方法。 (错误3在下面的代码)
如果你没有使用框架的有效性,这些错误不报告,直到下面调用一个方法的Mockito。 这可能是
- 在同样的测试方法(如下面错误1),
- 在接下来的测试方法(如下面误差2),
- 在接下来的测试类。
如果发生在你运行(如下面的错误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.
}
现在,当我第一次超过五年前写的这个答案,我写
因此,我建议使用的MockitoJUnitRunner
尽可能。 然而,由于托马斯已Nurkiewicz正确地指出,你不能,如果你需要另一个JUnit运行,例如Spring一个使用它。
现在我的建议已经改变。 该团队的Mockito添加了新的功能,因为我第一次写这个答案。 这是一个JUnit的规则,执行完全相同的功能与MockitoJUnitRunner
。 但它的好,因为它不排除使用其他选手的。
包括
@Rule
public MockitoRule rule = MockitoJUnit.rule();
在您的测试类。 这初始化的嘲笑,并自动化框架的验证; 就像MockitoJUnitRunner
一样。 但现在,你可以使用SpringJUnit4ClassRunner
或任何其他JUnitRunner为好。 从2.1.0的Mockito起,有精确控制什么样的问题得到报告的附加选项。
使用亚军让您保存编码的一点点(无需@Before
方法)。 在使用亚军另一方面,当你已经在使用一个,就像有时是不可能的,即SpringJUnit4ClassRunner
。
而已。 这仅仅是一个偏好的问题。