在编写新的jUnit4测试时,我想知道是使用@RunWith(MockitoJUnitRunner.class)还是MockitoAnnotations.initMocks(this)
我创建了一个新测试,并且向导使用Runner自动生成了一个测试。 MockitoJUnitRunner的Javadocs声明以下内容:

我尚不清楚使用Runner是否比我过去使用的initMocks()方法有任何优势。

最佳答案

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

框架使用的自动验证实际上是值得的。如果您犯了这些错误之一,它可以为您提供更好的报告。

  • 您调用静态when方法,但不要使用匹配的thenReturnthenThrowthen完成存根。 (下面的代码中的错误1)
  • 您在模拟程序上调用verify,但是忘记提供方法调用
    您正在尝试验证。 (下面的代码中的错误2)
  • 您可以在whendoReturndoThrow并传递一个模拟,但是忘记提供该方法
    您正在尝试存根。 (下面的代码中的错误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.
    }
    

    现在,五年多以前我第一次写这个答案时,



    我的建议现在已更改。自从我第一次写这个答案以来,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/

    10-11 20:49