【问题标题】:Testing threaded code java测试线程代码java
【发布时间】:2013-11-19 00:47:16
【问题描述】:

我正在测试某个使用 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 检测到(打印完成)。但是因为它在不同的线程中运行,所以测试报告它为空,所以它失败了,因为 isEmpty 在 assertFalse 中不应该为真。

【问题讨论】:

  • 那么您得到的问题、异常或输出是什么?
  • 我的借口,澄清已添加。

标签: java multithreading junit


【解决方案1】:
    File tempFile = File.createTempFile("temporary file", null, Paths.get(testdirectory).toFile());
    tempFile.deleteOnExit();
    Thread.sleep(5000);
    assertFalse(MyClass.getEvents().isEmpty());

我想 5 秒应该够长了吧?

此外,您可能需要使 getEvents 同步或其他内容。

【讨论】:

  • 我不认为这样做。我已经完全按照您给我的方式同步和实施了 getEvents,但是测试失败了。
  • 需要查看更多代码来确定同步是否正确。
【解决方案2】:

最简单的解决方案是仅单独测试AddToEvents(event) 代码。

创建模拟事件,然后致电您的 AddToEvents(event) 并进行测试以确保您做的是正确的事情。

这具有能够模拟在真实环境中难以模拟的事件的额外好处。

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多