如何在GWTTestCase中测试“定时器代码”?

时间:2014-04-18 21:19:12

标签: javascript gwt timer

我正在使用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]);
    }
}

1 个答案:

答案 0 :(得分:1)

感谢对@ColinAlworth的评论,该评论在另一个问题的评论中基本回答了这个问题,我发现支持测试计时器:GWTTestCase.delayTestFinish(int timeoutMillis) + finishTest()