我正在使用GWT编写代码,并且我创建了一个java.util.Timer 仿真,我可以 test 。在Java中,我会创建一个Timer,在其上激活一个任务,等待任务执行,然后成功返回单元测试方法(或者在一些超时到期后失败)。
我不太了解JavaScript(这就是我使用GWT的原因),但我看过使用JavaScript" native"定时器函数setTimeout()/ setInterval(),其中处理程序/回调,使用一个标志来确保在执行" 时没有调用#34;换句话说,一些例子表示/暗示它是可能的,当回调/处理程序需要很长时间才能执行时,它会再次再次调用,因为间隔用完了一次更多。因此,这些示例使用了一些标志,回调检查该标志以确保在最后一次调用尚未结束时它什么都不做。
这使我假设我可以使用setInterval()(间接地,通过GWT),在我的代码等待时让一些回调被执行。因为没有"睡眠"在JavaScript中,我使用了一个忙碌的循环"相反,但回调从未执行过。
那么,我的假设是关于" async回调"是错误的(有时,总是?),或者GWT Timer类(或htmlunit本身)以某种方式阻止了这种行为(idk如何在内部实现GWT Timer)?
更重要的是,我如何在GWTTestCase中测试我的java.util.Timer仿真,如果我在测试方法调用中创建的任何TimerTask只是执行,直到测试方法调用返回?
在"真实应用程序"中,会有一个"游戏循环",并且计时器任务可以在游戏循环周期之间自由运行。
GWT代码类似于:
public class TimerTest extends GWTTestCase {
public void testScheduleLong() {
final Timer timer = new Timer("test");
final boolean[] marker = new boolean[] { false };
new com.google.gwt.user.client.Timer() {
@Override
public void run() {
marker[0] = true;
}
}.schedule(10);
assertFalse("marker[0]", marker[0]);
double value = Long.MAX_VALUE;
// Waste time, to see if marker changes
final long start = System.currentTimeMillis();
while (!marker[0] && (System.currentTimeMillis() - start < 1000)) {
value = Math.sqrt(value);
if (value > 1) {
value = Long.MAX_VALUE;
}
}
assertTrue("marker[0]", marker[0]);
}
}
答案 0 :(得分:1)
感谢对@ColinAlworth的评论,该评论在另一个问题的评论中基本回答了这个问题,我发现支持测试计时器:GWTTestCase.delayTestFinish(int timeoutMillis) + finishTest()