我想用jUnit和Mockito測試我的實現,並且遇到問題。這是說明問題嘲笑Mockito接口的getter/setter方法
接口KeyValueInterface
public interface KeyValueInterface {
public abstract String getKey();
public abstract void setKey(String key);
public abstract String getValue();
public abstract void setValue(String value);
}
類KeyValueImpl
public class KeyValueImpl implements KeyValueInterface {
private String key;
private String value;
@Override
public String getKey() {
return key;
}
@Override
public void setKey(String key) {
this.key = key;
}
@Override
public String getValue() {
return value;
}
@Override
public void setValue(String value) {
this.value = value;
}
}
類具有 「商業邏輯」
public class ValueFinder {
public KeyValueInterface findValueForKey(KeyValueInterface keyValue){
keyValue.setValue("foo");
return keyValue;
}
}
JUnit測試類
非常簡單的例子import static org.junit.Assert.*;
import org.junit.Test;
import org.mockito.Mockito;
public class ValueFinderTest {
@Test
public void testNotMocked() {
KeyValueInterface keyValue = new KeyValueImpl();
keyValue = (new ValueFinder()).findValueForKey(keyValue);
assertEquals("foo", keyValue.getValue()); // works fine
}
@Test
public void testMocked1() {
KeyValueInterface keyValue = Mockito.mock(KeyValueInterface.class);
keyValue = (new ValueFinder()).findValueForKey(keyValue);
assertEquals("foo", keyValue.getValue()); // java.lang.AssertionError:
// expected:<foo> but
// was:<null>
}
@Test
public void testMocked2() {
KeyValueInterface keyValue = Mockito.mock(KeyValueInterface.class);
keyValue = (new ValueFinder()).findValueForKey(keyValue);
Mockito.when(keyValue.getValue()).thenCallRealMethod();
Mockito.doCallRealMethod().when(keyValue).setValue(Mockito.any(String.class));
assertEquals("foo", keyValue.getValue()); // org.mockito.exceptions.base.MockitoException:
// Cannot call real method
// on java interface.
// Interface does not have
// any implementation!
// Calling real methods is
// only possible when
// mocking concrete classes.
}
}
我的問題是,我需要模擬KeyValue的技術原因,這是我無法控制的。因此,我不能只使用方法testNotMocked()。同樣出於技術原因,我不得不嘲笑界面(而不是類)。
有什麼辦法可以達到這個目的嗎?
非常感謝。
謝謝,你的意思是來自Spring框架的ReflectionTestUtils? – Paul 2014-10-17 09:09:25
是的,但總體思路應該是相同的 – vikeng21 2014-10-17 11:26:29