Mockito 多接口匹配参数化方法

Mockito Matching parameterized method with multiple interface

您好,我已经为我的服务创建了一个很好的接口,它接受实现 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);

我只是想不出适合 any()、eq() 或任何可用的匹配器。 还是我正在尝试不可能的事情(在 java8 中)? 你能帮助我吗?

对 Document 和 ApproveDocumentsCommand 类型使用 any:

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

我这个 any(Document.class) 和 any(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;
    }
}