[英]Testing threaded code java
我正在测试使用WatchService的特定类。 此类具有一个名为processEvents的方法,其工作原理如下(来自http://docs.oracle.com/javase/tutorial/essential/io/notification.html ):
for (;;) {
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
// This key is registered only
// for ENTRY_CREATE events,
// but an OVERFLOW event can
// occur regardless if events
// are lost or discarded.
if (kind == MODIFY) {
//Do something
AddToEvents(event);
}
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
因此,它具有无限循环,需要在自己的线程中运行。 现在,我正在尝试测试“做某事”部分,但不确定如何做。 例如,此测试方法不应失败:
@Test
public void testEventAdded() {
Thread thread = new Thread() {
@Override
public void run() {
synchronized(currentThread) {
MyClass.processEvents();
}
}
};
thread.start();
File tempFile = File.createTempFile("temporary file", null, Paths.get(testdirectory).toFile());
tempFile.deleteOnExit();
assertFalse(MyClass.getEvents().isEmpty());
}
编辑:澄清,getEvents不应该为空(因为已经创建了一个文件),并且甚至可以由watchservice检测到(打印完成)。 但是因为它在不同的线程中运行,所以测试将其报告为空,所以它失败了,因为在assertFalse中isEmpty不应该为true。
File tempFile = File.createTempFile("temporary file", null, Paths.get(testdirectory).toFile());
tempFile.deleteOnExit();
Thread.sleep(5000);
assertFalse(MyClass.getEvents().isEmpty());
我想5秒应该足够长吗?
另外,您可能需要使getEvents
同步。
最简单的解决方案是仅单独测试AddToEvents(event)
代码。
创建模拟事件,然后调用您的AddToEvents(event)
并进行测试以确保您做正确的事。
这具有能够模拟在真实单词环境中难以模拟的事件的附加好处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.