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:
- Prueba de unidad Android: connectedAndroidTest no ejecuta mi caso de prueba
- Módulo de prueba de inyección con dagger2
- Cómo obtener la salida de registro de Android mostrada con las pruebas de JUnit (utilizando JUnit nativo sin emulador)
- ¿Hay una manera de iniciar el emulador de Android en Travis CI construir?
- Prueba de RxJava2 usando Espresso y obtener una excepción de puntero nulo cuando suscribeOn
@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")); }
- ¿Cómo ejecutar una prueba JUnit4 simple en Android Studio 1.1?
- La prueba de Android JUnit de Simpe se cuelga en Eclipse
- AndroidManifest en el directorio androidTest que se ignora
- Unidad de pruebas de aplicaciones de Android en Eclipse + jUnit - Prueba de ejecución falló: Prueba de ejecución incompleta. Se esperan 1 pruebas, recibidas 0
- La clase de prueba de Android falla al compilar en eclipse con error de "falta de coincidencia vinculada"
- Las pruebas consecutivas de Junit de Android no reflejan los datos reales de la base de datos subyacente
- Cómo burlar getApplicationContext
- Unidad probar un fragmento de Android
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()); }
- Gradle Build falló – Java.exe ha finalizado con un valor de salida diferente de cero 2
- El elemento ITEM no está permitido en MENU