了解Mockito框架下的情况



我在理解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

不过莫基托让我来处理吧。对此有什么解释吗?

我怀疑问题是由于调用顺序造成的。你的最后一行是有效的:

KeyValueImpl tmp = verify(keyValue);
String value = expectationManager.getExpectedValue();
tmp.setValue(value);

如果Mockito有效地使用verify方法调用作为标记来表示"下次调用模拟方法时,请检查它",而不验证调用了哪个模拟,那么验证的将是expectationManager.getExpectedValue()调用。

虽然我认为这是Mockito中令人困惑的行为,但我也认为这是一个令人困惑的测试-在另一个验证步骤中使用一个模拟对我来说就像是一种设计气味。我强烈考虑在可能的情况下使用手动编写的模拟,而不是模拟,只是为了避免模拟之间的太多交互。

相关内容

  • 没有找到相关文章

最新更新