繁体   English   中英

Mockito允许设置模拟的返回值

[英]Mockito allow mocked return value to be set

是否可以更改从模拟对象返回的值?

下面是一个解释我想要做的事情的例子。

public class MyClass{
  public void method(Mock obj){
    if(obj.getValue.equals("value"){
      obj.setValue("changedValue");
    }

    anotherObj.call(obj.getValue());
  }

所以上面的课程非常简单。 如果传入的值等于value,它将更改返回的值。

@Test
public void test(){
  Mock obj = mock(Mock.class);
  when(obj.getValue()).thenReturn("value");

  testClass.method(obj);

  verify(anotherObj, times(1)).call("changedValue");
}

测试想要验证是否使用更改的值调用anotherObj.call,但由于我们已将返回值模拟为“value”,因此将返回“value”时失败。

是否可以使用模拟的returnValue创建测试?

约翰坦是对的。 如果obj不是一个复杂的对象,你可以避免嘲笑它并使用一个真实的对象。

如果由于某种原因这是不可能的,mockito允许定义一系列答案,例如: when(obj.getValue()).thenReturn("value").thenReturn("modifiedValue"); 这可能是你正在寻找的。

虽然它可能有点过分,但为了确保一切正常,我还要verify(obj).setValue("changedValue"); verify(obj, times(2)).getValue();

而不是模仿obj ,为什么不使用实际的实现? 然后可能是setValuegetValue方法可以正常工作。

虽然我很感激这可能是不可能的,正如您所提到的,您的示例是您实际问题的简化版本。

这样就够了吗?

    ObjectUnderTest objectUnderTest = new ObjectUnderTest();
    ObjectUnderTest spy2 = Mockito.spy(objectUnderTest);

    when(spy2.getValue()).thenAnswer(new Answer<String>() {

        @Override
        public String answer(InvocationOnMock invocation) throws Throwable {
            Object realAnswer = invocation.callRealMethod();
            if (realAnswer.equals("SOME VALUE")) {
                return "SOME OTHER VALUE";
            }else {
                return realAnswer;
            }
        }
    });

因此,当真正的getValue返回一些值时,您可以用不同的值替换它...

试试这个:

@Test
public void test(){
  Mock obj = mock(Mock.class);

  doCallRealMethod().when(obj).setValue(any(String.class));
  when(obj.getValue()).thenCallRealMethod();
  obj.setValue("value");

  testClass.method(obj);

  verify(anotherObj, times(1)).call("changedValue");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM