残念ながら、Mockito のドキュメントには網羅的な情報が欠けているため、次のセットアップを作成する適切な方法を見つけるのは困難です。
テストする必要があるクラス「ResourceManager」があります。このクラスは、「get」というメソッドを持つ別のクラス「JerseyClient」をインスタンス化します。「ResourceManager」が実際の「JerseyClient」を呼び出すのではなく、そこからモック(またはスタブ?)を呼び出すようにしたい(Mockitoコンテキストでのモックとスタブ、またはモックとスパイの違いはすでに不明です)。
私の試みは、@Mock(または@Spy?)JerseyClient、または少なくとも1つのメソッドです:
@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"));
}
}
ご覧のとおり、定義済みの JSON 文字列を返す jerseyClient.get() メソッドをモックしようとしました。
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 要求を作成しようとするためです。
解決策は何ですか?ここでやりたいことは何ですか? 実際のオブジェクトをスパイしているのか、それともオブジェクトのメソッドをモックしたいオブジェクトをモックしているのか、いつメソッドを置き換えることができますか? モックのみまたはスパイのみ?