我使用gwt-test-utils框架编写了一个单元测试,如here所述。
测试类内部使用com.google.gwt.user.client.Timer
(不是Java默认计时器)。
但是,仅在测试时,Timer实例的行为不正确,因为它会在计划后立即触发。
当我运行此测试时
public class TimerTest extends GwtTest {
@Override
public String getModuleName() {
return "com.whatevs";
}
@Test
public void testTimer() {
final int[] counter = { 0 };
com.google.gwt.user.client.Timer t = new Timer() {
@Override
public void run() {
Log.info("firing timer");
counter[0]++; // just increase the counter
}
};
Log.info("scheduling timer");
t.schedule(1000000); // this should return immediately
Log.info("scheduling returns");
assertEquals(0, counter[0]); // the counter shouldn't yet be incremented
}
}
我失败了
testTimer(com.whatevs.TimerTest): expected:<0> but was:<1>
调试输出
22:37:44,075 INFO gwt-log:81 - scheduling timer
22:37:44,075 INFO gwt-log:81 - firing timer
22:37:44,075 INFO gwt-log:81 - scheduling returns
请注意,测试是作为JUnit测试运行的,而不是先编译为JavaScript。
我做错了什么,还是我碰到了一个错误? 有没有其他方法来测试这样的类?
更新:
我刚刚发现如果在上面的例子中我调用了scheduleRepeating,或者我在run方法中使用schedule重新安排了计时器,那么在将控制权返回给调用者之前,计时器会正好触发5次。
奇怪的是,我刚刚在gwt-test-utils上打开了a bug report。