Mockito允许设置模拟的返回值

时间:2013-09-18 09:19:13

标签: java mockito

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

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

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

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

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

@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创建测试?

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

这样就够了吗?

    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返回一些值时,您可以用不同的值替换它......

答案 3 :(得分:0)

试试这个:

@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");
}