2014-04-18 10 views
1

我正在使用GWT编写代码,并且我创建了一个java.util.Timer 仿真,我可以通过测试。在Java中,我会创建一个Timer,在其上触发一个任务,等待任务执行完毕,然后成功返回单元测试方法(或失败,在某个超时过期后)。我不太了解JavaScript(这就是我使用GWT的原因),但我已经看到了使用JavaScript“native”定时器函数setTimeout()/ setInterval()的示例,其中处理程序/回调函数使用了一个标志,以确保它不被称为“执行中”。换句话说,一些示例说/暗示它是可能的,虽然回调/处理程序需要很长时间来执行,但随后又再次调用,因为时间间隔再次耗尽。所以这些例子使用了一些标志,回调被检查以确保它的最后一次调用没有结束时什么都不做。如何测试GWTTestCase中的“计时器代码”?

这让我假设我可以使用setInterval()(间接通过GWT)来获得一些回调来执行,而我的代码正在等待。由于JavaScript中没有“睡眠”,我使用了“繁忙循环”,但回调从未得到执行。因此,我关于“异步回调”的假设是错误的(有时候总是?),或者GWT计时器类(或者htmlunit本身)以某种方式阻止了这种行为(idk GWT计时器是如何在内部实现的),那么是不是这样呢? ?

更重要的是,如何在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

我认为你不能在GWT的客户端使用'java.util.Timer'。 – Braj

+0

@Braj我想你错过了这部分:“我创建了一个java.util.Timer仿真”;我为“缺少”JRE java.util.Timer类创建了一个“超级源代码”,就像谷歌自己为许多JRE类所做的那样。 GWT中的JRE模拟非常细化,因此无需额外的JRE仿真类即可将任何重要的*现有*项目移植到GWT中。 GWT本身提供了自己的Timer类;只是它使用了不同的API,因此强制用户代码依赖于GWT。一个java.util.Timer模拟允许我在“共享代码”中删除GWT的显式依赖。 –

+0

是的,你是绝对正确的。 – Braj

回答