Junit / Mockito – esperar la ejecución del método

En mi aplicación utilizo patrón de observador para algunas operaciones y quiero probarlas en pruebas unitarias. El problema es que no sé cómo puedo probar observadores usando junit / mockito / algo más. ¿Alguna ayuda?

Por ejemplo, esta es mi prueba de unidad:

@Before public void setUp() throws IOException, Exception { observer = new GameInstanceObserver(); // observable (GameInstance) will call update() method after every change GameInstance.getInstance().addObserver(observer); // this is observable which is updated by serverService } @Test(expected = UserDataDoesntExistException.class) public void getRoomUserData_usingNullKey_shouldThrowUserDataDoesntExist() throws InterruptedException, UserDataDoesntExistException { serverService.createRoom("exampleRoom"); // this operation is asynchronous and updates GameInstance data (as I wrote before GameInstance is Observable) Thread.sleep(400); // how to do it in better way? GameInstance gi = (GameInstance) observer.getObservable(); assertTrue(gi.getRoom("exampleRoom").getRoomId().equals("exampleRoom")); } 

Me gustaría no usar Thread.sleep() y usarlo de esa manera (o similar):

 @Test(expected = UserDataDoesntExistException.class) public void getRoomUserData_usingNullKey_shouldThrowUserDataDoesntExist() throws InterruptedException, UserDataDoesntExistException { serverService.createRoom("exampleRoom"); // this operation is asynchronous and updates GameInstance data (as I wrote before GameInstance is Observable) waitUntilDataChange(GameInstance.getInstance()); // wait until observable will be changed so I know that it notified all observer and I can validate data GameInstance gi = (GameInstance) observer.getObservable(); assertTrue(gi.getRoom("exampleRoom").getRoomId().equals("exampleRoom")); } 

Si entiendo correctamente, el problema no es realmente probar al observador, sino probar el resultado de una llamada de método asíncrono. Para ello, cree un observador que bloquee hasta que su método update () haya sido llamado. Algo como lo siguiente:

 public class BlockingGameObserver extends GameInstanceObserver { private CountDownLatch latch = new CountDownLatch(1); @Override public void update() { latch.countDown(); } public void waitUntilUpdateIsCalled() throws InterruptedException { latch.await(); } } 

Y en su prueba:

 private BlockingGameObserver observer; @Before public void setUp() throws IOException, Exception { observer = new BlockingGameObserver(); GameInstance.getInstance().addObserver(observer); } @Test public void getRoomUserData_usingNullKey_shouldThrowUserDataDoesntExist() throws InterruptedException, UserDataDoesntExistException { serverService.createRoom("exampleRoom"); observer.waitUntilUpdateIsCalled(); assertEquals("exampleRoom", GameInstance.getInstance().getRoom("exampleRoom").getRoomId()); } 
  • Error en el corredor al realizar pruebas con Robolectric
  • NoClassDefFoundError al intentar ejecutar pruebas unitarias en Android Studio
  • ¿Cómo ejecutar pruebas de unidad para Android no está en el dispositivo o emulador?
  • ¿Por qué fallan las grandes pruebas de unidad de actividad de Android?
  • Prueba de la unidad de Android que no informa Fallando con error ()
  • ¿Cómo puedo ejecutar una única prueba de Android con Kotlin?
  • ¿Cómo puedo probar el código de Android que tenga View Animators?
  • Robolectric's Shadow Object y Mocking
  • Prueba de la clase de comunicación con DB a través de DAO de ORMLite
  • Pruebas unitarias con Android Studio y Gradle?
  • Tratando de probar un módulo de Android en la aplicación MultiDex, com.android.test.runner.MultiDexTestRunner no se reconoce
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.