Pregunta

Tengo una situación inusual que estoy probando.Estoy usando Espresso para escribir mis pruebas.Sé Espresso y InstrumentationTestCase no está pensado para ello.

Tengo un Oyente que he creado en una de mis clases que me notificará de un cambio de un valor determinado.Yo uso el oyente en mi suite de prueba.

Cuando llego el valor de la escucha, tengo que afirmar se ha cambiado el valor como tal.

Mi problema es el examen final antes de que voy a recibir la forma de valor de la escucha.

    private void sendSpeedChanges() {
    setStaticSpeed(new Random().nextInt(10) + 2);
    try {
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                consoleActivity.onSpeedChanged(getStaticSpeed(), false);
            }
        });
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }

}

private void createSpeedDelegate() {
    EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
        @Override
        public void onSpeedChanged(double speed) {
            //assert speed is correct.
            assertTrue(getStaticSpeed() == speed);
        }
    });

}

Estos son los dos métodos que estoy usando.El createSpeedDelegate() es llamada en el principio.Entonces me llame sendSpeedChanges.Necesito hacer esto X cantidad de veces.


NOTA:

  • Se tarda alrededor de 200 milisegundos para recuperar info (En promedio).
  • Yo no puedo llamar sendSpeedChanges() hasta que he comprobado el valor en onSpeedChange()
  • No puedo utilizar Thread.sleep(); debido a que el oyente está en el hilo principal.

He intentado la adición de un getInstrumentation().wait(2000); y también getInstrumentation().waitForIdleSync(); Obviamente, ni el trabajo.

En un mundo perfecto, yo haría esto:

   for (int i = 0; i < 42; i++) {
        sendSpeedChanges();
        i++;
    }

Pero, esto no va a esperar a que el valor comprobado.Y si yo espere a que el valor de la prueba corredor piensa que todas las pruebas se llevan a cabo y termina.

Mi pregunta es decir, habría una manera de controlar cuando la prueba se cierra?Aunque mis pruebas aparecen para ser hecho.

¿Fue útil?

Solución

En su prueba, usted necesitará crear una sentencia de control que mantiene que la prueba durante el tiempo que quieres que se ejecute.

while(myTestNeedsToRun) {
    if(speedChangeReceived) {
        sendSpeedChange();
        speedChangeReceived = false;
    }
}

private void createSpeedDelegate() {
   EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
    @Override
    public void onSpeedChanged(double speed) {
        //assert speed is correct.
        assertTrue(getStaticSpeed() == speed);
        speedChangedReceived = true;
    }
});

Una vez que usted decide que se termine la ejecución de su prueba de conjunto myTestNeedsToRun = false y, a continuación, su prueba final.

Otros consejos

Alternativamente, usted podría crear una IdlingResource para controlar su velocidad.IdlingResource es la forma en que Expreso utiliza para verificar que el Hilo Principal está inactivo o que no hay AsyncTasks que se ejecuta en el AsyncTask de la piscina.

Tiene un loook en coutingIdlingResource clase en el código fuente de la biblioteca.Se podría implementar algo similar a eso.En su caso, podría ser algo como esto:

[...]

private int mTargetSpeed;
private volatile ResourceCallback resourceCallback;

@Override
public boolean isIdleNow() {
  boolean isIdle = false;
  if (getStaticSpeed() == mTargetSpeed) {
     isIdle = true;
     resourceCallback.onTransitionToIdle();
  } else {
     isIdle = false;
  }

  return isIdle;
}

En las pruebas, siempre que se quiere esperar a que la velocidad para alcanzar el nivel deseado, usted debe hacer:

[...]
SpeedIdlingResource speedIdlingResource = new SpeedIdlingResource ("my_idling_resource");
Espresso.registerIdlingResources(speedIdlingResource);

De esta manera, máquina de café Espresso bloqueará hasta que el ralentí de recursos cuenta el marco de su SpeedMonitor está inactivo.Eso es goode debido a aprovechar todos Espresso sincronización de marco para supervisar cuando se alcanza la velocidad objetivo, por lo que las pruebas sería más fiable y más rápido que el de hacer un ocupados esperar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top