¿Cómo los métodos de prueba de unidad publicados por Event Bus en android?
Estoy usando el bus de eventos de Otto en mi aplicación. En una de mis clases estoy publicando el evento.
MyEvent myevent = new MyEvent(); uiBus.post(myEvent);
Soy capaz de probar el método post.
- Diálogo de prueba en ActivityUnitTestCase de Android
- Acceso al contexto de la aplicación desde TestSuite en Setup () antes de llamar a getActivity ()
- ¿Cómo probar un AlertDialog en Android?
- Multidex límite de golpear mientras se ejecutan casos de prueba de unidad
- ¿Por qué realizar pruebas en un proyecto separado, en lugar de carpeta?
Ahora hay otra clase que está recibiendo el evento.
//ReceiverClass.java @Subscribe public void onEventReceived(MyEvent myevent) { callAMethod(); }
¿Cómo puedo probar la unidad que este método fue invocado. He intentado con el siguiente código de prueba
@Mock Bus uiBus; @Test public void testBusReceviedEvent() { ReceiverClass instance = new ReceiverClass(); mockBus.register(instance); MyEvent myevent = new MyEvent(); mockBus.post(myEvent); //Test verify(instance, times(1)).callAMethod(); }
Pero este código no funciona.
- Unidad de prueba Java clase que carga la biblioteca nativa
- Prueba Unitaria de Retrofit 2 api call con Mockito
- Prueba de la unidad Android: Bundle / Parcelable
- Robolectric: NotFoundException: recurso desconocido 0 en org.robolectric.shadows.ShadowAssetManager.getAndResolve (ShadowAssetManager.java:258)
- IllegalStateException en Android Support al ejecutar pruebas de unidad
- Cómo probar menú en Android con Robolectric
- Prueba de unidad de Android con Retrofit y Mockito
- Prueba de clases sin actividad en Android
No funciona porque la instance
no es un simulacro. Tendrá que verificar los efectos de callAMethod
o poner ese método en otra clase e inyectar un simulacro de esta nueva clase en su clase ReceiverClass
.
Por ejemplo…
private class ReceiverClass { private MyNewClass theNewClassIWasTalkingAbout; // Stick in a setter for that ^ @Subscribe public void onEventReceived(MyEvent myevent) { theNewClassIWasTalkingAbout.callAMethod(); } }
Entonces su prueba tendrá que cambiar un poco …
@Mock private MyNewClass mockNewClass; @InjectMocks // This will be the "solid" implementation of the thing you are trying to test, it is not a mock... private ReceiverClass instance; @Test public void testBusReceivedEvent() { mockBus.register(instance); MyEvent myevent = new MyEvent(); mockBus.post(myevent); verify(mockNewClass, times(1)).callAMethod(); }
Espero que esto ayude.
Estoy un poco tarde a la fiesta, pero aquí hay un ejemplo de una clase que funciona y cuenta para llamadas asincrónicas. En lugar de Mocking EventBus simplemente dejamos que haga lo que es y lo registramos en la clase TestDriver
continuación.
Lo que hace que esto funcione es el CountDownLatch
que, con la ayuda de la clase abstracta DataTransferCallback
, espera que latch.countDown()
sea llamado o 5 segundos para pasar.
Simplemente registre su clase de prueba y en el método @Subscribe, pase de nuevo al método que creó el DataTransferCallback
y haga sus aserciones allí.
@RunWith(AndroidJUnit4.class) public class TestDriver { private final CountDownLatch latch = new CountDownLatch(1); private EventBus eventBus; private DataTransferCallback transferCallback; public abstract class DataTransferCallback { abstract void onSuccess(DataTransfer event); } @Before public void setUp() { EventBus.getDefault().register(this); eventBus = spy(EventBus.getDefault()); } @SuppressWarnings("unchecked") @Test public void test200Resposne() throws InterruptedException { // Get known good JSON final String json = TestJSON.get200Response(); // Class under test final Driver driver = new Driver(InstrumentationRegistry.getTargetContext()); final JsonParser jsonParser = new JsonParser(); //boolean to hold our test result final boolean[] testPassed = new boolean[]{false}; transferCallback = new DataTransferCallback() { @Override public void onSuccess(DataTransfer event) { assertNotNull(event); verify(eventBus).post(event); assertThat(event.getStatus(), is("OK")); assertTrue(event.getData() != null); testPassed[0] = true; } }; //Set our test EventBus object driver.setEventBus(eventBus); // The actual method under test driver.parseData(jsonParser.parse(json)); // Set a countdown latch to wait for the result (5s) latch.await(5000, TimeUnit.MILLISECONDS); // will wait here until 5s or the @Subscrube method is hit assertTrue(testPassed[0]); } //Because we want to examine EventBus Output, register it //to this class and pass the event back through our custom abstract class @Subscribe public void onReceiveEventBusEvent(DataTransfer event) { assertNotNull(transferCallback); transferCallback.onSuccess(event); //notify latch so that we can proceed latch.countDown(); } }
- Visual Studio Android Emulator – Grabación de video
- Generar estilo de xml en intellij (/ android studio)