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