当前位置: 首页 > 知识库问答 >
问题:

@runwith(MockitoJunitRunner.class)vs MockitoAnnotations.initMocks(this)

西门磊
2023-03-14

在编写新的jUnit4测试时,我想知道是使用@runwith(MockitoJunitrunner.class)还是MockitoAnnotations.initMocks(this)

我创建了一个新测试&向导自动用运行器生成了一个测试。用于MockitoJUnitRunner的Javadocs声明如下:

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

共有1个答案

臧欣怿
2023-03-14

MockitoJunitRunner为您提供了对框架使用情况的自动验证,以及一个自动的initMocks()

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

>

  • 调用静态when方法,但不要使用匹配的thenreturnthenthrowthen完成stubbing。(下面代码中的错误1)

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

    • 在相同的测试方法中(类似下面的错误1),
    • 在下一个测试方法中(如下面的错误2),
    • 在下一个测试类中。

    如果它们发生在您运行的最后一个测试中(如下面的错误3),则根本不会报告它们。

    @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。但是,正如Tomasz Nurkiewicz正确指出的那样,如果您需要另一个JUnit运行程序,比如Spring运行程序,就不能使用它。

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

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

    在你的测试课上。这将初始化模拟,并自动化框架验证;就像MockitoJunitRunner一样。但是现在,您也可以使用SpringJUnit4ClassRunner或任何其他JUnitRunner。从Mockito 2.1.0开始,有更多的选项可以控制报告的问题类型。

  •  类似资料:
    • 我的代码: }在这个特定的测试中没有失败,但是当我运行这个套件时,Mockito会告诉我不正确使用匹配器的情况。 我也可以做一些类似的事情:

    • 我是说替换 只要 在班上名列前茅。对我有用。 请给出你的建议。 使用SpringJunit4ClassRunner.class而不是MockitoJunitRunner.class

    • 问题内容: 我写单元测试,并希望使用和一个测试类。 不幸的是,以下操作无效: 有没有办法在一个测试类中同时使用Mockito和JUnitParams? 问题答案: 您不能执行此操作,因为根据规范,您不能将相同的注释两次放置在相同的注释元素上。 那么,解决方案是什么?解决的办法是只放一个你无法忍受的赛跑者,然后用其他东西代替。对于您的情况,我想您将删除并以编程方式执行此操作。 实际上,它唯一要做的就

    • 问题内容: 我有这个非常简单的课程: 在类路径中指定的此上下文文件不存在。我几乎可以输入任何想要的名称,并且代码不会中断。我的意思是测试运行正常,就好像该文件确实存在。 如果我从: classpath 到 classpath* 做了一个小的更改,它会发出喙,表示该文件不存在,这也是我在第一种情况下的预期行为。 春季版本3.2.3。 有人可以解释这种奇怪的行为吗? 编辑 建议的日志内容: 我什至尝试

    • 我试图让RunWith(PowerMockRunner.class)处理我现有的包注释。 版本: Powermock 1.4.12 mockito 1.9.0 jUnit 4.8.2 package-info.java//这是包注释 测试说明。java//这是包“com.smin.dummy”的元数据注释类 A、 爪哇 莫卡。Java语言 在unitest MockA中。如果我不使用RunWith