繁体   English   中英

测试线程代码Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM