org.mockito.exceptions.misusing.InvalidUseOfMatchersException错位参数匹配器

时间:2015-03-19 11:08:43

标签: java unit-testing mockito

我收到以下异常

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected here:

You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
    when(mock.get(anyInt())).thenReturn(null);
    doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
    verify(mock).someMethod(contains("foo"))

代码行

@Mock    
Template templateParser = new TemplateParser();
when(templateParser.getLayoutIdsFromTemplate(any(HashMap.class)))
                           .thenReturn(Arrays.asList("id1", "id2"));

我正在嘲笑的功能如下

public class TemplateParser {
    public List<String> getLayoutIdsFromTemplate(HashMap<String, Object> parsedTemplate)
    {
        List<String> listOfLayoutIds = new ArrayList<String>();

        //Loading listOfLayoutIds here

        return listOfLayoutIds;
    }
}

谁能告诉我这是什么问题?

1 个答案:

答案 0 :(得分:0)

您的模拟方法getLayoutIdsFromTemplate正在接收键入的HashMap<String, Object>参数,而不是简单的HashMap。这是InvalidUseOfMatchersException的原因。

如果你可以做一点重构,你可以解决它:

1)将您的方法更改为接收Map<String, Object>而不是Hashmap<String, Object>

   public List<String> getLayoutIdsFromTemplate(Map<String, Object> parsedTemplate) {
      ...
   }

2)在测试类中,使用Mockito.anyMapOf(String.class, Object.class))代替Mockito.any(HashMap.class))匹配参数:

when(templateParser.getLayoutIdsFromTemplate(anyMapOf(String.class, Object.class))).thenReturn(Arrays.asList("id1", "id1"));

希望它有所帮助。