Jak mohu jednotka testovat Android aktivitu, která působí na Akcelerometr?

hlasů
5

Začínám s aktivitou založenou off tohoto ShakeActivity a chci psát nějaké jednotkové testy pro něj. Napsal jsem několik malých unit testy pro Android činnosti před, ale nejsem si jistý, kde začít zde. Chci nakrmit akcelerometru některé odlišné hodnoty a vyzkoušet, jak činnost reaguje na něj. Pro tuto chvíli nechám to jednoduché a jen aktualizovat vlastní int counter proměnnou a TextView když „shake“ události dojde.

Takže moje otázka do značné míry scvrkává na toto:

Jak mohu poslat falešný data akcelerometru z testu jednotky?

Položena 10/05/2010 v 23:49
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
4

Jak mohu poslat falešný data akcelerometru z testu jednotky?

Pokud vím, to nemůžeš.

Vyjádřete svůj shaker logika akceptovat zapojitelné zdroj dat. V testu jednotky, zadat vysmíval. Ve výrobě, dodávat obal kolem akcelerometru.

Nebo se nemusíte starat o jednotce testování šejkru samotný, ale spíše starat o testování jednotky věcí, které používají shaker, a vytvořit falešný šejkru.

Odpovězeno 11/05/2010 v 01:00
zdroj uživatelem

hlasů
1

No, můžete napsat rozhraní.

interface IAccelerometerReader {
    public float[] readAccelerometer();
}

Zapsat AndroidAccelerometerReadera FakeAccelerometerReader. Váš kód bude používat IAccelerometerReader, ale můžete vyměnit v Android nebo Fake čtenářů.

Odpovězeno 11/05/2010 v 20:08
zdroj uživatelem

hlasů
5

Mé řešení tohoto problému skončila cesta jednodušší, pak jsem čekal. Nejsem opravdu testování akcelerometru tolik jako jsem testování odezvy aplikace na události vznesené akcelerometru, a já jsem potřeboval, aby odpovídajícím způsobem otestovat. Moje třída implementuje SensorListener a chtěl jsem vyzkoušet, co se stane onSensorChanged. Klíčem pak bylo krmení některých hodnot a zkontrolovat stav mého působení se. Příklad:

public void testShake() throws InterruptedException {
    mShaker.onSensorChanged(SensorManager.SENSOR_ACCELEROMETER, new float[] {0, 0, 0} );
    //Required because method only allows one shake per 100ms
    Thread.sleep(500);
    mShaker.onSensorChanged(SensorManager.SENSOR_ACCELEROMETER, new float[] {300, 300, 300});
    Assert.assertTrue("Counter: " + mShaker.shakeCounter, mShaker.shakeCounter > 0);
}
Odpovězeno 11/05/2010 v 20:18
zdroj uživatelem

hlasů
0

Není třeba vyzkoušet OS je akcelerometr, prostě vyzkoušet svou vlastní logiku, která reaguje na OS - jinými slovy vaší SensorListener. Bohužel SensorEventje soukromý a nemohl jsem volat SensorListener.onSensorChanged(SensorEvent event)přímo, takže musel první podtřídy SensorListener s mou vlastní třídu a volat svou vlastní metodu přímo ze zkoušek:

public  class ShakeDetector implements SensorEventListener {

     @Override
     public void onSensorChanged(SensorEvent event) {

         float x = event.values[0];
         float y = event.values[1];
         float z = event.values[2];

         onSensorUpdate(x, y, z);
     }

     public void onSensorUpdate(float x, float y, float z) {
         // do my (testable) logic here
     }
}

Pak mohu volat onSensorUpdatedpřímo z mé testovací kód, který simuluje střelbu akcelerometru.

private void simulateShake(final float amplitude, int interval, int duration) throws InterruptedException {
    final SignInFragment.ShakeDetector shaker = getFragment().getShakeSensorForTesting();
    long start = System.currentTimeMillis();

    do {
        getInstrumentation().runOnMainSync(new Runnable() {
            @Override
            public void run() {
                shaker.onSensorUpdate(amplitude, amplitude, amplitude);
            }
        });
        Thread.sleep(interval);
    } while (System.currentTimeMillis() - start < duration);
}
Odpovězeno 03/04/2017 v 20:34
zdroj uživatelem

hlasů
0
  public  class SensorService implements SensorEventListener {
/**
     * Accelerometer values
     */
    private float accValues[] = new float[3];
     @Override
     public void onSensorChanged(SensorEvent event) {

          if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            accValues[0] = sensorEvent.values[0];
            accValues[1] = sensorEvent.values[1];
            accValues[2] = sensorEvent.values[2];
        }

     }
} 

můžete otestovat nad kus kódu následujícím způsobem

@Test
    public void testOnSensorChangedForAcceleratorMeter() throws Exception {
        Intent intent=new Intent();
        sensorService.onStartCommand(intent,-1,-1);

        SensorEvent sensorEvent=getEvent();
        Sensor sensor=getSensor(Sensor.TYPE_ACCELEROMETER);
        sensorEvent.sensor=sensor;
        sensorEvent.values[0]=1.2345f;
        sensorEvent.values[1]=2.45f;
        sensorEvent.values[2]=1.6998f;
        sensorService.onSensorChanged(sensorEvent);

        Field field=sensorService.getClass().getDeclaredField("accValues");
        field.setAccessible(true);
        float[] result= (float[]) field.get(sensorService);
        Assert.assertEquals(sensorEvent.values.length,result.length);
        Assert.assertEquals(sensorEvent.values[0],result[0],0.0f);
        Assert.assertEquals(sensorEvent.values[1],result[1],0.0f);
        Assert.assertEquals(sensorEvent.values[2],result[2],0.0f);
    } 




private Sensor getSensor(int type) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
            Constructor<Sensor> constructor = Sensor.class.getDeclaredConstructor(new Class[0]);
            constructor.setAccessible(true);
            Sensor sensor= constructor.newInstance(new Object[0]);

            Field field=sensor.getClass().getDeclaredField("mType");
            field.setAccessible(true);
            field.set(sensor,type);
            return sensor;
        }



private SensorEvent getEvent() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Constructor<SensorEvent> constructor = SensorEvent.class.getDeclaredConstructor(int.class);
        constructor.setAccessible(true);
        return constructor.newInstance(new Object[]{3});
    }
Odpovězeno 13/08/2017 v 21:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more