gpt4 book ai didi

java - 了解 Mockito 框架背后发生的事情

转载 作者:行者123 更新时间:2023-12-01 12:25:07 24 4
gpt4 key购买 nike

我在理解 Mockito 框架中发生的事情时遇到了问题。我有以下类(class)

模型类

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 让我能够适应它。这有什么解释吗?

最佳答案

我怀疑问题是由于调用顺序造成的。您的最后一行实际上是:

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

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

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

关于java - 了解 Mockito 框架背后发生的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com