Sto provando a creare un test con Robolectric. Il mio obiettivo è di essere in grado di sostituire la funzionalità di una classe (che viene ad esempio da una libreria e non posso modificare il codice) da un comportamento personalizzato.Robolectric shadow non funziona
Ho creato questo piccolo test per simulare quello che voglio fare:
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowMessenger.class})
public class TestShadow {
@Test
public void testMessenger() {
OriginalMessenger messenger = new OriginalMessenger();
String message = messenger.getMessage();
Assert.assertEquals("Shadow messenger", message);
}
public static class OriginalMessenger {
public String getMessage() {
return "Original messenger";
}
}
@Implements(OriginalMessenger.class)
public static class ShadowMessenger extends OriginalMessenger {
@Implementation
public String getMessage() {
return "Shadow messenger";
}
}
}
Nell'esempio, OriginalMessenger è la classe che si trova nella libreria e fornisce una funzionalità predefinita. E ShadowMessenger è la classe che contiene il comportamento personalizzato che voglio applicare ogni volta che utilizzo OriginalMessenger.
Tuttavia quando eseguo il test fallisce. Il contenuto del messaggio è "Messenger originale". Come se lo ShadowMessenger non fosse mai usato.
Cosa sto sbagliando?
Perché fare un'ombra? Perché non 'mock' o' stub' it out? –
Come ottengo lo stesso risultato usando mock e stub? –
Oh, vedo nenick ha risolto il tuo problema? Puoi usare EasyMock/PowerMock per deridere la tua classe o Spock (Robospock). Guarda un esempio qui: https://github.com/jaredsburrows/BurrowsAppsExamples/blob/master/Lib-BurrowsApps/src/test/java/burrows/apps/example/lib/utils/PlayServicesUtilsTest.java. –