Mockito,JUnit和Map嵌套在另一个类中

时间:2014-10-24 15:06:02

标签: java map junit mockito

我是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
...

我不知道为什么,请帮我解决这个问题。 提前谢谢。

3 个答案:

答案 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);    
 . . .
}