我在解决Mockito框架中发生的事情时遇到了问题。我有以下课程
模型类
public class KeyValueImpl{
private String key;
private String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
"业务逻辑"类
public class ValueFinder {
public KeyValueImpl findValueForKey(KeyValueImpl keyValue){
keyValue.setValue("foo");
return keyValue;
}
}
返回预期结果的实用程序类(将被模拟)
public class ExpectationManager {
public String getExpectedValue(){
return "loremipsumdolorem";
}
}
测试课
public class ValueFinderTest {
@Test
public void testMocked() {
KeyValueImpl keyValue = Mockito.mock(KeyValueImpl.class);
keyValue = (new ValueFinder()).findValueForKey(keyValue);
ExpectationManager expectationManager = Mockito.mock(ExpectationManager.class);
when(expectationManager.getExpectedValue()).thenReturn("somethingDifferentToFoo");
String expectedValue = expectationManager.getExpectedValue();
verify(keyValue).setValue(expectedValue); //fails, expects "foo" but gets "somethingDifferentToFoo" -> ok
verify(keyValue).setValue(expectationManager.getExpectedValue()); //no error, but why?
}
}
有趣的事情发生在测试类的最后一行:
verify(keyValue).setValue(expectationManager.getExpectedValue()); //no error, but why?
我当然会期待与上面一行相同的行为
verify(keyValue).setValue(expectedValue); //fails, expects "foo" but gets somethingDifferentToFoo" -> ok
然而Mockito让我相处得很好。对此有何解释?
答案 0 :(得分:1)
我怀疑问题是由于通话顺序造成的。你的最后一行是有效的:
KeyValueImpl tmp = verify(keyValue);
String value = expectationManager.getExpectedValue();
tmp.setValue(value);
如果 Mockito有效地使用verify
方法调用作为标记来说“下次调用模拟方法,请检查它”而不验证调用哪个模拟,然后它将是经过验证的expectationManager.getExpectedValue()
来电。
虽然我认为这在Mockito中是令人困惑的行为,但我也认为这是一个令人困惑的测试 - 在另一个的验证步骤中使用一个模拟对我来说就像一个设计气味。我强烈考虑在可能的情况下使用手动编写的假货而不是模拟,只是为了避免模拟之间的过多交互。