2014-10-17 54 views
0

我在这里了解Mockito框架中发生了什么问题。我有以下类了解Mockito框架下发生了什么

Model类

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让我相处它。任何解释?

+1

您的'ValueFinder'类完全不使用'ExpectationManager',那么为什么这会涉及到您的测试?你究竟想在这里测试什么? – 2014-10-17 10:23:22

+0

我在我的Test类中使用它。 expectationManager返回我在我的验证方法中使用的值。在这个例子中,为了简单起见,所有的东西都被简化了。 – Paul 2014-10-17 10:34:24

+1

嗯,但是为什么 - 是不是你正在测试你的*生产*代码?你说你会嘲笑ExpectationManager ...当你开始嘲笑那些只在那里进行测试的类时,这听起来对我来说是非常错误的...... – 2014-10-17 10:35:55

回答

1

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

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

如果的Mockito被有效利用verify方法调用作为标记说“下一次模拟的方法被调用,检查”无验证其嘲笑它的呼吁,那么它将是经过验证的expectationManager.getExpectedValue()呼叫。

虽然我认为这是在混淆的Mockito的行为,我倒是认为,这是一个令人困惑的试验 - 使用像一个设计气味我一个感觉的验证步骤中的一个模拟。我会强烈考虑使用手动编写的假货,而不是在可能的情况下模仿,以避免模拟之间的过多交互。

+0

假的和假的有什么区别? – Svante 2014-10-17 11:10:42

+0

嗨,乔恩,是的,我认为这是解释问题和aswers我的问题。我也同意你的观点,那就是我试图做的是有点混乱的设计。我会尽可能地避免这种情况。再次感谢,保罗 – Paul 2014-10-17 11:11:38