【发布时间】:2013-03-20 20:51:55
【问题描述】:
如果你有一个循环,它每 5 秒创建一次文本文件,并以它创建的时间戳命名,你可以创建一个 junit 测试,看看它是否被创建?你会怎么检查?
感谢您的帮助
【问题讨论】:
-
我会模拟用于实际创建文件的对象,并验证是否使用正确的参数调用了创建函数。恕我直言,它不再是单元测试,如果您实际上必须验证在文件系统中创建的文件...
如果你有一个循环,它每 5 秒创建一次文本文件,并以它创建的时间戳命名,你可以创建一个 junit 测试,看看它是否被创建?你会怎么检查?
感谢您的帮助
【问题讨论】:
我会使用Mockito 模拟创作。并检查是否调用了create方法以及使用了哪个文件名。
【讨论】:
您始终可以检查该文件是否存在,但这更像是集成测试而不是单元测试。
推荐的方法是像这样创建某种FileCreator 接口
public interface FileCreator {
void createFile(Date date);
}
创建格式化时间的实现,然后进行单元测试 - 验证当您调用 createFile 时,您的文件确实已创建。这应该很简单。
现在,在创建文件的类中使用它 - 假设它看起来像这样
public class FileCreationManager {
private final FileCreator fileCreator;
private final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
private Future<?> taskHandle;
public FileCreationManager(final FileCreator fileCreator) {
this.fileCreator = fileCreator;
}
public void startFileCreation() {
taskHandle = executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
fileCreator.createFile(new Date());
}
}, 0, 5, TimeUnit.SECONDS);
}
public void stopFileCreation() {
taskHandle.cancel(false);
executorService.shutdown();
try {
executorService.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
您的单元测试可以传入FileCreator 的虚拟实现,您只需检查createFile 是否被正确的Date 调用。
您可以运行创建线程几秒钟,然后将传入的 Dates 收集到 Collection - 您的单元接下来需要检查 Dates 是否相隔 5 秒,并且是否存在正确的数量。
【讨论】: