2015-06-25 9 views
33

Sembra che mockito verifichi solo se viene chiamato un metodo di un oggetto mock e l'oggetto mock ha sempre sth. come doReturn(). quando (oggetto fittizio) ...come si chiama un metodo di un oggetto non fittizio?

Ma posso creare un oggetto fittizio e definire doReturn(). quando (oggetto fittizio) .. e quindi verificare viene chiamato un metodo di un altro oggetto?

Ecco cosa voglio fare: definisco un mockEnvironment e restituisco una risposta indipendentemente da ciò che accade. Ma poi voglio verificare diversi metodi di anotherObj è chiamato in diversi casi.

Come fare?

public class BaseClass { 
    private Environment mockEnvironment; 
    @Test 
    public void testcase() { 
    setMockitoEnvironment(); 
    response = foo(mockEnvironment, argument1); 
    verify(anotherObj).codePath1(...); 
    response = foo(mockEnvironment, argument2); 
    verify(anotherObj).codePath2(...); 
    } 
} 

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2. 
private void setMockitoEnvironment() { 
    mockEnvironment = mock(Environment.class); 
    doReturn (response).when(mockEnvironment).createResponse(for any input); 
} 
private Response foo(...) { 
    ... 
    return createResponse(...); 
} 

risposta

47

È possibile utilizzare un Mockito Spy per questo. Se si imposta anotherObj come spia, è possibile verificare le chiamate di metodo su quell'oggetto. Nel tuo esempio devi assicurarti che la chiamata a foo usi la spia invece di un'implementazione ordinaria di anotherObj. La spia è configurata in questo modo:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass()); 
// do stuff 
verify(anotherObjSpy).codePath1(...); 
+0

Ciò significa che potrebbe essere necessario creare e iniettare più oggetti falsificati se voglio verificare più cose? non è conveniente – user389955

+0

@ user389955 sì, è necessario impostare ogni oggetto che si desidera controllare come spia. Per quanto ne so, non c'è modo di aggirarlo. Mockito deve aggiungere un proxy agli oggetti e qualcuno deve dire a Mockito quali oggetti proxy. –

+1

Invece di dire "// do stuff" potrebbe essere utile aggiungere che è "anotherObjSpy" che deve effettuare la chiamata al metodo in fase di test. – jwehrle