Il problema con l'utilizzo di RETURN_DEEP_STUBS è che si otterrà un falso diverso ogni volta che si chiama un metodo. Dalla tua domanda penso che tu voglia utilizzare una risposta predefinita che restituisca effettivamente il mock su cui è stata chiamata, per ogni metodo che ha il giusto tipo di ritorno. Questo potrebbe apparire come il seguente. Nota che non ho ancora provato questo, quindi potrebbe contenere errori di battitura, ma spero che l'intenzione sia chiara in ogni caso.
import static org.mockito.Mockito.RETURNS_DEFAULTS;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public class SelfReturningAnswer implements Answer<Object>{
public Object answer(InvocationOnMock invocation) throws Throwable {
Object mock = invocation.getMock();
if(invocation.getMethod().getReturnType().isInstance(mock)){
return mock;
}
else{
return RETURNS_DEFAULTS.answer(invocation);
}
}
}
Quindi, quando si crea il proprio mock, specificare questa come risposta predefinita. Questo renderà il tuo finto ritorno se stesso da ogni metodo che può; ma si comporterà come un normale finto quando chiami un metodo il cui tipo di ritorno è sbagliato per la simulazione.
Crea il tuo finto come questo
Builder mockBuilder = mock(Builder.class, new SelfReturningAnswer());
o creare una costante per questa classe e scrivere qualcosa di simile
@Mock(answer = SELF_RETURNING) private Builder mockBuilder;
Speranza che aiuta.
fonte
2011-12-16 05:32:19
Hai davvero bisogno di deridere questo? Non sembra il tipo di dipendenza che vale la pena di deridere. Sembra un tipo "di dati" di classe, piuttosto che un tipo di "servizio" di classe. Raramente trovo utile creare classi in cui non c'è un comportamento reale. –
È solo un esempio, il vero costruttore è un po 'più complesso e non è necessario testare in questo caso. –
Puoi separarli in modo che tu * abbia * ottenuto un "muto costruttore" (che non ha bisogno di deridere) e quindi la parte di servizio che * ha * bisogno di deridere? –