Leider fehlen in der Mockito-Dokumentation umfangreiche Informationen, es ist schwierig, den richtigen Weg zur Erstellung des folgenden Setups zu finden.Mockito: Wie man Methode der Klasse ersetzt, die von Klasse in Test aufgerufen wird?
Ich habe eine Klasse "ResourceManager", die getestet werden sollte. Diese Klasse instanziiert eine andere Klasse "JerseyClient", die eine Methode namens "get" hat. Ich will "ResourceManager" nicht auf den echten "JerseyClient" aufrufen sondern einen Mock (oder einen Stub?) Daraus (Mir ist schon unklar, was der Unterschied zwischen Spott und Stubbing oder Spott und Spion im Mockito-Kontext ist).
Meine Versuche sind @Mock (oder @Spy?) JerseyClient oder zumindest ein Verfahren davon:
@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"));
}
}
Wie Sie sehen können, habe ich versucht jerseyClient.get() Methode zu verspotten zurückzukehren eine vordefinierte JSON-String:
when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}");
oder
doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString());
Aber keiner von ihnen arbeiten. Das bedeutet, dass die echte JerseyClient.get-Methode aufgerufen wird, da versucht wird, eine HTTP-Anfrage mit dem echten JerseyClient zu stellen.
Was ist die Lösung und was soll ich hier machen? Spioniert er ein reales Objekt aus oder verspottet er ein Objekt, wo ich eine Methode davon verspotten will, und wann kann ich Methoden ersetzen, nur auf Spott oder nur auf Spione?