@RunWith(MockitoJUnitRunner.class)与MockitoAnnotati

2019-05-16 16:21发布

在写一个新的jUnit4测试,我想知道是否使用@RunWith(MockitoJUnitRunner.class)MockitoAnnotations.initMocks(本)。

我创建一个新的测试&向导自动生成与所述转轮的测试。 对于MockitoJUnitRunner的Javadoc声明如下:

使用JUnit 4.4和更高版本兼容,这个亚军增加了以下行为:

初始化用模拟注释嘲笑,让MockitoAnnotations.initMocks(对象)的明确的使用是没有必要的。 嘲笑每个测试方法之前被初始化。 验证每个试验方法后框架的使用。

目前尚不清楚对我使用亚军是否有过initMocks()方法,我一直在使用过去任何优势。

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

Answer 1:

MockitoJUnitRunner为您提供了框架使用的自动验证,以及自动initMocks()

框架使用的自动验证实际上是值得拥有的。 它可以让你更好的报告,如果你让这些错误之一。

  • 您调用静态when的方法,但不具有匹配完成磕碰thenReturnthenThrowthen(在下面的代码错误1)

  • 你叫verify在一个模拟的,但忘了向您提供您尝试验证的方法调用。 (错误2在下面的代码)

  • 您调用when之后方法doReturndoThrowdoAnswer并通过一个模拟的,但忘了向您提供您正试图存根方法。 (错误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起,有精确控制什么样的问题得到报告的附加选项。



Answer 2:

使用亚军让您保存编码的一点点(无需@Before方法)。 在使用亚军另一方面,当你已经在使用一个,就像有时是不可能的,即SpringJUnit4ClassRunner

而已。 这仅仅是一个偏好的问题。



文章来源: @RunWith(MockitoJUnitRunner.class) vs MockitoAnnotations.initMocks(this)