我是Mockito的初学者,我在创建存根时遇到问题。我有以下界面:
public interface IMsgField {
public String getName();
public Object getValue();
}
一个类实现上面的接口如下
public final class CMsgField implements IMsgField {
private String name;
private Object value;
public CMsgField(String name, Object value) {
this.name = name;
this.value = value;
}
. . .
}
我还有一节课:
class FieldsWrapper {
private Map<String, IMsgField> fields = new HashMap<String, IMsgField>();
. . .
public Map<String, IMsgField> getFields() {
return fields;
}
}
我创建了以下junit测试:
@Test
public void test() {
FieldsWrapper fieldsWrapper = mock(FieldsWrapper.class);
stub(fieldsWrapper.getFields()).toReturn(new HashMap<String, IMsgField>());
stub(fieldsWrapper.getFields().get("id_object")).toReturn(new CMsgField("id_object", "100"));
. . .
}
当我运行此测试时,我在上面测试的最后一行收到以下异常:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
CMsgField cannot be returned by getFields()
getFields() should return Map
...
我不知道为什么,请帮我解决这个问题。 提前谢谢。
答案 0 :(得分:1)
我会模拟Map或使用局部变量:
@Test
public void test() {
Map<String, IMsgField> testMap = new HashMap<String, IMsgField>();
testMap.put("id_object", new CMsgField("id_object", "100"));
FieldsWrapper fieldsWrapper = mock(FieldsWrapper.class);
stub(fieldsWrapper.getFields()).toReturn(testMap);
}
答案 1 :(得分:1)
你应该这样做:
@Test
public void test() {
Map<String, IMsgField> stubbedMap = new HashMap<String, IMsgField>();
stubbedMap.put("id_object", new CMsgField("id_object", "100"));
FieldsWrapper fieldsWrapper = mock(FieldsWrapper.class);
stub(fieldsWrapper.getFields()).toReturn(stubbedMap);
}
因为你只需要存根fieldsWrapper.getFields()。 testMap.get(&#34; id_object&#34;)是来自Map的方法调用,它不是存根的,所以它无法工作。
答案 2 :(得分:0)
在模拟时你不能做方法调用链。
@Test
public void test() {
FieldsWrapper fieldsWrapper = mock(FieldsWrapper.class);
HashMap<String, IMsgField>() map = new HashMap<String, IMsgField>();
map.put("id_object", CMsgField("id_object", "100"));
stub(fieldsWrapper.getFields()).toReturn(map);
. . .
}