У меня есть класс Java, как показано ниже. Его задача - следить за файлом, если размер этого файла не изменяется с определенным интервалом, он выдаст предупреждение.
Я бы хотел написать для него два UT.
1. Симулирует размер файла, оставляя неизменными.
2. Размер файла симуляции сохраняет изменения некоторое время. После этого размер файла изменится.
UT проверит, что alertster.alert () или alertster.harmless () действительно вызывается, когда условие выполнено или не выполнено. Я высмеял Alerter и передал его конструктору Task. Но как контролировать время запуска ()? Я знаю, что время для многопоточности не может контролироваться точно. Я просто хотел бы знать, как лучше писать на этом уроке. Если возможно, пожалуйста, напишите тестовый образец.
Вы можете считать, что " некоторое условие " проверяет, изменяется ли размер указанного файла через определенный интервал. Если не измениться, некоторые условия будут выполнены.
class Task implements Runnable{
Alerter alerter;
boolean stop=false;
public Task(Alerter alerter){
this.alerter=alerter;
}
public void run() {
while (!stop){
if (some condition){
alerter.alert();
} else{
alerter.harmless();
}
Thread.sleep(5000);
}
}
public synchronized void stop(){
stop=true;
}
}
Я думаю написать что-то вроде ниже. Но я не думаю, что это достаточно хорошо.
@Test
public void testRunWithFeed() {
Alerter mockAlerter=mock(Alerter.class);
Task task=new Task(mockAlerter);
Thread thread =new Thread(task);
thread.start();
try {
Thread.sleep(1000); // give Task.run() a change to run
} catch (InterruptedException e) {
e.printStackTrace();
}
task.stop();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
verify(mockAlerter,atLeastOnce()).alert();
verify(mockAlerter,never()).harmless();
}
@Test
public void testRunNoFeed() {
Alerter mockAlerter=mock(Alerter.class);
Task task=new Task(mockAlerter);
Thread thread =new Thread(task);
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
changeFileSize();
try {
Thread.sleep(6000); //because every 5000ms file size will be checked once in run()
} catch (InterruptedException e) {
e.printStackTrace();
}
task.stop();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
verify(mockAlerter,atLeastOnce()).alert();
verify(mockAlerter,atLeastOnce()).harmless();
}
Заранее спасибо.