gpt4 book ai didi

java - 如何测试定时器?

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:21 25 4
gpt4 key购买 nike

我想为一个方法编写一个测试,在特定的时间间隔调用观察者,以便他们执行一个方法。计时器对象在其自己的线程中运行。

要测试定时器的方法
private long waitTime;

public Metronome(int bpm) {
this.bpm = bpm;
this.waitTime = calculateWaitTime();
this.running = false;
}

public void run() {
long startTime = 0, estimatedTime = 0, threadSleepTime = 0;

running = true;

while (running) {
startTime = System.nanoTime();

tick();// notify observers here

estimatedTime = System.nanoTime() - startTime;
threadSleepTime = waitTime -estimatedTime;
threadSleepTime = threadSleepTime < 0 ? 0 : threadSleepTime;

try {
Thread.sleep(threadSleepTime / 1000000l);

} catch (InterruptedException e) {
// sth went wrong
}
}
}
我的测试类的片段
private int ticks;
private long startTime;
private long stopTime;

@Test
public void tickTest(){
metronome.setBpm(600);
startTime = System.nanoTime();
metronome.run();
long duration = stopTime - startTime;
long lowThreshold = 800000000;
long highThreshold = 900000000;
System.out.println(duration);
assertTrue(lowThreshold < duration);
assertTrue(duration <= highThreshold);
}

@Override
public void update(Observable o, Object arg) {
ticks ++;
if(ticks == 10){
metronome.stop();
stopTime = System.nanoTime();
}
}

现在,我的测试类注册为相关对象的观察者,这样我就可以计算 tick() 的执行次数。该测试测量执行前后的时间,但以这种方式测试行为对我来说感觉很尴尬。

有什么改进测试的建议吗?

最佳答案

有时解决方案是使用标准库中的一些东西,这些东西足够简单,不需要测试。我认为 SchedulerExecuterService 可以替代正在此处测试的自制 Timer。请注意,库代码中的错误很少见,但它们确实存在。

但总的来说,我认为创建一个辅助类或使用模拟框架 (Mockito) 来做一些简单的事情(比如计算“滴答”)是可以的。

附言您可以将 Thread.sleep(threadSleepTime/1000000l) 替换为 TimeUnit.NANOSECONDS.sleep(threadSleepTime) ... 这会将代码中的一些逻辑移至标准库中。

关于java - 如何测试定时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12573910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com