メソッドを実行するために、特定の間隔でオブザーバーを呼び出すメソッドのテストを書きたいと思います。timer-object は独自のスレッドで実行されます。
テストするタイマーの方法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() が実行された回数を数えることができます。テストは実行前後の時間を測定しますが、このように動作をテストするのは面倒です。
テストを改善するための提案はありますか?