具有多个接口的Mockito匹配参数化方法

时间:2017-06-29 06:27:26

标签: mockito matcher

您好我为我的服务创建了一个很好的接口,它接受实现2个接口的对象,但现在我很难为这个接口创建匹配器。

任何人都知道如何为以下内容创建匹配器?

<T extends HasDocumentTags & HasResources> ResponseEntity<Void> setDocumentMetadata(T t);

只是一个any()在这里没有帮助,因为该方法已经重载了两次

ResponseEntity<Void> setDocumentMetadata(List<Document> attachments);
ResponseEntity<Void> setDocumentMetadata(ApproveDocumentsCommand<?> command);

现在我正在尝试模拟服务并定义答案

when(service.setDocumentMetadata( ??? ).thenReturn(anAnswer);

我无法找出任何(),eq()或其他任何工作的正确匹配器。 或者我在尝试不可能的事情(在java8中)? 你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

使用任何类型Document和ApproveDocumentsCommand:

when(service.setDocumentMetadata(any(Document.class)).thenReturn(anAnswer1);
when(service.setDocumentMetadata(any(ApproveDocumentsCommand.class)).thenReturn(anAnswer2);

我这个(Document.class)和任何(ApproveDocumentsCommand.class)应该是enoght。

你也可以使用ArgumentMatcher,如果你需要检查类型的参数和一些额外的检查:

    when(service.setDocumentMetadata(argThat(new MyCommonMatcher<>())))
         .thenReturn(responseEntityOk);
    when(service.setDocumentMetadata(argThat(new MyDocumentMatcher<>())))
        .thenReturn(responseEntityOk);
    when(service.setDocumentMetadata(argThat(new MyApproveDocumentsCommandMatcher<>()))) 
       .thenReturn(responseEntityOk);

class MyCommonMatcher<T extends HasDocumentTags & HasResources> 
                                                      extends ArgumentMatcher<T>{

    @Override
    public boolean matches(Object argument) {
        return (argument instanceof HasResources) && (argument instanceof HasDocumentTags);
    }
}

class MyDocumentMatcher<T extends HasDocumentTags & HasResources> 
                                                       extends ArgumentMatcher<T>{

    @Override
    public boolean matches(Object argument) {
        return argument instanceof Document;
    }
}

class MyApproveDocumentsCommandMatcher<T extends HasDocumentTags & HasResources> 
                                                         extends ArgumentMatcher<T>{

    @Override
    public boolean matches(Object argument) {
        return argument instanceof ApproveDocumentsCommand;
    }
}