2016-11-30 109 views
0

我試圖嘲弄以下模式模擬的Mockito重載方法

JestClient { 

    DocumentResult execute(Index x) {...} 

    BulkResult execute(Bulk y) {...} 
} 

我用下面的代碼來創建嘲笑的重載的方法。

JestClient client = Mockito.mock(JestClient.class); 

    DocumentResult setResult = Mockito.mock(DocumentResult.class); 
    when(setResult.isSucceeded()).thenReturn(true); 

    BulkResult bulkResult = Mockito.mock(BulkResult.class); 
    when(bulkResult.isSucceeded()).thenReturn(true); 

    // when(client.execute(Mockito.any(Index.class))).thenReturn(setResult); 
    // when(client.execute(Mockito.any(Bulk.class))).thenReturn(bulkResult); 

    doReturn(setResult).when(client).execute(Mockito.any(Index.class)); 
    doReturn(bulkResult).when(client).execute(Mockito.any(Bulk.class)); 

    JestClientFactory factory = Mockito.mock(JestClientFactory.class); 
    when(factory.getObject()).thenReturn(client); 

生成的模擬總是返回第二個模擬並忽略第一個,而不管作爲參數傳遞的對象類型如何。

+0

'Bulk'和'Index'之間的關係是什麼?一個擴展另一個嗎? – Mureinik

+0

它們都是同一個超類的子類。 –

+0

這些'execute'方法是否覆蓋了在接口上定義的方法?特別是一個通用的? –

回答

0

我希望它是好的,如果我使用的答案,因爲它不適合評論。 您是否嘗試過在此處使用Mockito.argThat(Hamcrest.isA(SomeClass.class))

doReturn(setResult).when(client).execute(argThat(isA(Index.class))); 

如果你想提供一個可執行的例子,這將是有幫助的。我試圖重新實現你的情況,但我的測試是綠色的。你的情況有什麼不同?

import static org.hamcrest.MatcherAssert.assertThat; 
import static org.hamcrest.Matchers.isA; 
import static org.mockito.Matchers.any; 
import static org.mockito.Matchers.argThat; 
import static org.mockito.Mockito.doReturn; 
import static org.mockito.Mockito.mock; 

import org.junit.Test; 

public class SomeTest { 

    @Test 
    public void testName() throws Exception { 
     JestClient client = mock(JestClient.class); 

     DocumentResult setResult = mock(DocumentResult.class); 
     BulkResult bulkResult = mock(BulkResult.class); 

     doReturn(setResult).when(client).execute(any(Index.class)); 
     doReturn(setResult).when(client).execute(argThat(isA(Index.class))); 
     doReturn(bulkResult).when(client).execute(any(Bulk.class)); 

     assertThat(client.execute(new Index()), isA(DocumentResult.class)); 
     assertThat(client.execute(new Bulk()), isA(BulkResult.class)); 
    } 

    public class Input {} 

    public class Index extends Input {} 

    public class Bulk extends Input {} 

    public class JestClient { 

     DocumentResult execute(Index x) { 
      return new DocumentResult(); 
     } 

     BulkResult execute(Bulk y) { 
      return new BulkResult(); 
     } 
    } 

    public class BulkResult {} 

    public class DocumentResult {} 
}