2013-06-08 7 views
5

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?

Antwort

6

Ich fand die Antwort alleine. Ich muss hinzufügen,

@InjectMocks 
private ResourceManager resourceManager; 

Dann muss ich den Test mit diesem Fall laufen:

@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")); 
    } 
} 

Und ich kann auch die „doReturn ... wenn“ verwenden Muster.

Verwandte Themen