2016-06-22 14 views
2

方法がありますpublic Content createChild(String path, String contentType, Map<String,Object> properties)私は模擬したいです。Mockitoメソッドを模擬しますが、模擬返品のパラメータを使用してください

私はそれがどのような引数でも呼び出されるので、when()は実際にはどのメソッドを受け取るべきかを教えなければならないので、このメソッドを呼び出す必要があります。

実際には、指定された引数(スパイを使用します)とは独立した任意のメソッド呼び出しに反応し、次に与えられるContentオブジェクトを返すために何らかのコールバックを呼び出します。メソッド。

これをサポートするMockitoで特定のAPIが見つかりませんでした。あなたはマッチャー

MyClass m = mock(MyClass.class); 
when(m.createChild(any(String.class), any(String.class), any(Map.class))).thenReturn(new Content()); 

を使用することができます

答えて

1

また、パラメータを使用することができるはずこのよう

when(m.createChild(any(String.class), any(String.class), any(Map.class))).thenAnswer(
     new Answer<Content>() 
     { 
      @Override 
      public Content answer(final InvocationOnMock invocation) throws Throwable 
      { 
       return new Content((String) invocation.getArguments()[0], 
(String) invocation.getArguments()[1], 
(Map) invocation.getArguments()[2]); 
       } 
      } 
     } 
     ); 
3

あなたはMatchersを使用することができます。

あなたのような何かを試すことができます

when(service.createChild(anyString(), anyString(), anyMap())) 
    .thenReturn(any(Content.class)); 
+0

実際に何をしていると思いますか(Content.class)ですか? –

+1

['thenReturn(T value)'](http://site.mockito.org/mockito/docs/current/org/mockito/stubbing/OngoingStubbing.html#thenReturn(T))は、嘲笑されたメソッドの結果を返します。返された 'Content'について気にしない場合は、上記のコードを使用してください。そうすれば 'new Content()'や作成する他の 'Content'オブジェクトを使うことができます。 – thegauravmahawar

+0

それは虚偽のコンテンツクラスを返しますか? –

1

できます。私はこれのための簡単な単体テストを書いています

public class MockitoTest { 


    private SampleService sampleService; 

    @Before 
    public void setUp() throws Exception { 
     sampleService = Mockito.mock(SampleService.class); 
    } 

    @Test 
    public void mockitoTest() throws Exception { 
     when(sampleService.createChild(anyString(), anyString(), anyMapOf(String.class, Object.class))) 
      .thenAnswer(invocationOnMock -> { 
       //Here you can build result based on params 
       String pathArg = (String) invocationOnMock.getArguments()[0]; 
       if (pathArg.equals("p1")) { 
        return new Content("Content for p1"); 
       } else if (pathArg.equals("p2")) { 
        return new Content("Content for p2"); 
       } else { 
        return invocationOnMock.callRealMethod(); 
       } 
      }); 

     Content content = sampleService.createChild("p1", "any", new HashMap<>()); 
     assertEquals("Content for p1", content.getData()); 

     content = sampleService.createChild("p2", "any", new HashMap<>()); 
     assertEquals("Content for p2", content.getData()); 

     content = sampleService.createChild("whatever", "any", new HashMap<>()); 
     assertEquals("original", content.getData()); 

    } 

    /** 
    * Sample service with method 
    */ 
    private static class SampleService { 

     public Content createChild(String path, String contentType, Map<String, Object> properties) { 
      return new Content("original"); 
     } 

    } 

    /** 
    * Content example 
    */ 
    private static class Content { 

     private String data; 

     Content(String data) { 
      this.data = data; 
     } 

     String getData() { 
      return data; 
     } 
    } 

} 
関連する問題