2017-06-29 45 views
0

您好我已經爲我的服務創建了一個很好的接口,它接受實現2接口的對象,但現在我很難爲此接口創建一個匹配器。Mockito與多接口匹配的參數化方法

任何人有任何想法如何爲以下創建一個匹配器?

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

只是一個任意()不會幫助這裏,因爲該方法已經超負荷運轉兩次

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

現在我試圖嘲弄服務和確定的答案

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

我只是無法找出任何(),eq()或任何將工作的正確匹配器。 或者我嘗試的東西是不可能的(在java8中)? 你能幫我嗎?

回答

0

使用任何類型文檔和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; 
    } 
} 
+0

日Thnx的答案! –