是否可以更改从模拟对象返回的值?
下面是一个解释我想要做的事情的例子。
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创建测试?
答案 0 :(得分:3)
Johnatan是对的。如果obj
不是一个复杂的对象,你可以避免嘲笑它并使用一个真实的对象。
如果由于某种原因这是不可能的,mockito允许定义一系列答案,例如:when(obj.getValue()).thenReturn("value").thenReturn("modifiedValue");
可能是您正在寻找的答案。
虽然它可能有点过分,但为了确保一切正常,我还会verify(obj).setValue("changedValue");
和verify(obj, times(2)).getValue();
答案 1 :(得分:2)
为什么不使用实际的实现,而不是模仿obj
?然后大概setValue
和getValue
方法可以正常工作。
虽然我很感激这可能是不可能的,正如您所提到的,您的示例是您实际问题的简化版本。
答案 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");
}