Я хотел бы написать тест для метода, который вызывает наблюдателей в определенном интервалах, чтобы они выполняли метод. Таймер-объект работает в своем потоке.
Метод проверяемого таймера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();
}
}
Сейчас мой тестовый класс регистрируется как наблюдатель на рассматриваемом объекте, так что я могу подсчитать количество раз, когда был выполнен пометка(). Тест измеряет время до и после казни, но мне кажется неудобным, чтобы проверить поведение таким образом.
Любые предложения по улучшению теста?