Нет необходимости проверять акселерометр ОС, просто проверьте свою собственную логику, которая реагирует на ОС - другими словами, ваш SensorListener
. К сожалению, SensorEvent
является частным, и я не мог вызвать SensorListener.onSensorChanged(SensorEvent event)
напрямую, поэтому пришлось сначала создать подкласс SensorListener с моим собственным классом и вызывать мой собственный метод непосредственно из тестов:
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
}
}
Тогда я могу позвонить onSensorUpdated
прямо из моего тестового кода, который имитирует срабатывание акселерометра.
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);
}