¿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.

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.

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(); } } 
  • Pruebas de unidad en Android Studio 0.8
  • Android inmediatamente creado Los elementos de par son nulos
  • La falla de Android ActivityMonitor hace que getActivity () nunca vuelva
  • Cómo llamar a Button.performClick en Android JUnit test case?
  • Mock Retrofit Observable <T> respuesta en las pruebas de la unidad Android
  • Mockito - ¿Qué hace el método de verificación?
  • ¿Cómo burlar el método de Bundle en Android Unit-Test?
  • ActivityUnitTestCase y startActivity
  • Configuración de la prueba de unidad para varios módulos
  • Ejecutar todas las pruebas de unidad en Android Studio
  • Pruebas de unidades de Android que requieren contexto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.