我正在测试一个不寻常的情况。我正在使用 Espresso 编写测试。我知道 Espresso 和 InstrumentationTestCase 并不打算这样做。
我有一个在我的一个类中创建的监听器,它会通知我某个值的变化。我在我的测试套件中使用监听器。
当我从侦听器获取值时,我需要断言该值已被更改。
我的问题是测试将在我收到来自侦听器的值之前结束。
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);
}
});
}
这是我正在使用的两种方法。一createSpeedDelegate()
开始就是调用。然后我打电话sendSpeedChanges
。我需要做这个 X 次。
笔记:
- 检索信息大约需要 200 毫秒(平均)。
sendSpeedChanges()
在我检查了值之前我不能打电话onSpeedChange()
- 我不能使用
Thread.sleep();
,因为监听器在主线程上。
我已经尝试添加一个getInstrumentation().wait(2000);
,而且getInstrumentation().waitForIdleSync();
显然,两者都不起作用。
在一个完美的世界里,我会这样做:
for (int i = 0; i < 42; i++) {
sendSpeedChanges();
i++;
}
但是,这不会等待检查值。如果我确实等待该值,测试运行器会认为所有测试都已完成并终止。
我的问题是,是否有办法控制测试何时退出?即使我的测试似乎已经完成。