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(...);
}
Ciò significa che potrebbe essere necessario creare e iniettare più oggetti falsificati se voglio verificare più cose? non è conveniente – user389955
@ 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. –
Invece di dire "// do stuff" potrebbe essere utile aggiungere che è "anotherObjSpy" che deve effettuare la chiamata al metodo in fase di test. – jwehrle