2013-06-08 4 views
5

残念ながら、Mockitoのドキュメントには網羅的な情報がないため、以下の設定を作成する方法を見つけるのが難しいです。Mockito:テスト中のクラスから呼び出されたクラスのメソッドを置き換える方法は?

私はクラス "ResourceManager"をテストする必要があります。このクラスは、 "get"というメソッドを持つ別のクラス "JerseyClient"をインスタンス化します。私は "ResourceManager" が本当の "JerseyClient"を呼び出さないようにしたいのですが、そこからモック(またはスタブ?)を呼び出すようにしてください(モックイトの文脈では、モックとスタブ、モックとスパイの違いは何ですか? (?または@Spy)

私の試みは@MockにJerseyClientある、またはそれの少なくとも一つの方法:あなたが見ることができるように

@RunWith(MockitoJUnitRunner.class) 
public class ResourceManagerTest 
{ 
    @Mock 
    private JerseyClient jerseyClient; 


    @Test 
    public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException 
    { 
     TestEntity testEntity = new TestEntity(); 
     ResourceManager resourceManager = new ResourceManager(); 

     testEntity.setGet(true); 
     testEntity.setTestAttribute("1stTest"); 

     when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}"); 

//  doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString()); 

     TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class); 

     assertThat(result, is(notNullValue())); 
     assertThat(result.getMessage(), is("success")); 
     assertThat(result.getTestAttribute(), is("2ndTest")); 
    } 
} 

、私は返すようにjerseyClient.get()メソッドを模擬してみました事前に定義されたJSON文字列:

when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}"); 

または

doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString()); 

しかし、それらのどれも動作しません。つまり、実際のJerseyClient.getメソッドが呼び出されるのは、実際のJerseyClientでHTTP要求を行うためです。

解決策とは何ですか、私はここで何をしたいのですか?それは実際のオブジェクトを盗んでいるか、私がそのメソッドを模擬したいオブジェクトを嘲笑しているのですか?また、メソッドを置き換えることはできますか?

答えて

6

私は自分で答えを見つけました。

@RunWith(MockitoJUnitRunner.class) 
public class ResourceManagerTest 
{ 
    @Mock 
    private JerseyClient jerseyClient; 

    @InjectMocks 
    private ResourceManager resourceManager; 

    @Test 
    public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException 
    { 
     TestEntity testEntity = new TestEntity(); 

     testEntity.setGet(true); 
     testEntity.setTestAttribute("1stTest"); 

     when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}"); 

     TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class); 

     assertThat(result, is(notNullValue())); 
     assertThat(result.getMessage(), is("success")); 
     assertThat(result.getTestAttribute(), is("2ndTest")); 
    } 
} 

そして、私はまた、「doReturn ...と、」パターンを使用することができます。私はその後、私は、このインスタンスでテストを実行する必要が

@InjectMocks 
private ResourceManager resourceManager; 

を追加する必要があります。

関連する問題