【问题标题】:Mockito doReturn if method of a object with certain class is called如果调用具有特定类的对象的方法,则 Mockito doReturn
【发布时间】:2017-01-26 07:57:27
【问题描述】:

如果我有一个对象 MyObject,我想在调用该对象的某个方法时返回一些值。例如这样的:

doReturn(someValue).when(Mockito.any(MyObject.class)).getSomeValue();

我试过这样,但它不起作用:

org.mockito.exceptions.misusing.NullInsteadOfMockException: 
Argument passed to when() is null!

【问题讨论】:

    标签: java unit-testing spring-boot junit mockito


    【解决方案1】:

    您需要使用Mockito.mock(MyObject.class) 来创建对象的模拟。

    目前您正在使用 Mockito#any,它是一个参数匹配器,用于在为 any 给定参数调用存根方法时定义模拟行为。

    @Test
    public void testMock() throws InterruptedException {
        MyObject myObjectMock = Mockito.mock(MyObject.class);
        doReturn(2).when(myObjectMock).getSomeValue();
    
        System.out.println(myObjectMock.getSomeValue()); // prints 2
    }
    
    private class MyObject {
        public int getSomeValue() {
            return 1;
        }
    }
    

    【讨论】:

    • 你是对的,你的这个例子有效,但在我的情况下,我想我必须添加一些额外的东西,因为它没有返回任何值。
    • @mirzak 我不太懂你,你能举个例子吗?
    • 这个解决方案是正确的,我的对象被不相关的东西覆盖了。
    • 我只需要使用 ReflectionTestUtils 将它设置到我的字段中。 ReflectionTestUtils.setField(this.someService, "myField", mock);
    【解决方案2】:

    或者,您可以使用 Mockito 注释:

    @RunWith(MockitoJUnitRunner.class)
    public class YourTestClass {
      @Mock 
      MyObject myObjectMock
    

    使您免于在设置或测试方法中手动模拟该对象。

    【讨论】:

    • 这是一个最好的解决方案,因为您可以在多重测试中使用模拟对象(此处为 myObjectMock)。在我的项目中,我们使用 @ExtendWith(MockitoExtension.class) 而不是 @RunWith(MockitoJUnitRunner.class)
    • 你可以声明一个没有注解的字段,但是你必须在一些@Before方法中手动实例化模拟。请注意,ExtendWith 是 JUnit 5,这个答案是在 JUnit5 可用之前编写的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2018-10-08
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多