0

“行动中的骆驼”一书中,我找到了这个测试示例:

@Test
public void testMoveFile() throws Exception {
    // create a new file in the inbox folder with the name hello.txt and containing Hello World as body
    template.sendBodyAndHeader("file://target/inbox", "Hello World", Exchange.FILE_NAME, "hello.txt");

    // wait a while to let the file be moved
    Thread.sleep(2000);

    // test the file was moved
    File target = new File("target/outbox/hello.txt");
    assertTrue("File should have been moved", target.exists());

    // test that its content is correct as well
    String content = context.getTypeConverter().convertTo(String.class, target);
    assertEquals("Hello World", content);
}

显然这是一个集成测试——我们测试了多个单元,但是:

  • 像这样的测试(使用 Thread.sleep)是否被认为是好的做法?
  • 我们可以做得更好,离开集成测试方法吗?
4

4 回答 4

1

那么它的鸡肉和鸡蛋。正如在 Camel in Action 一书中,稍后我们将向您介绍 NotifyBuilder,它允许您在没有线程睡眠的情况下进行测试。参见第 6 章第 6.4.2 节。

在 Camel 网站 http://camel.apache.org/notifybuilder.html上也有一些关于 NotifyBuilder 的详细信息

于 2013-09-05T06:17:12.363 回答
1

我同意大艾尔的观点。如果可以避免,则不应使用 Thread.sleep 并且如果这样做(这在测试前端行为时很常见),您肯定希望循环一段设定的时间,如果它没有在 X 中完成则失败毫秒。

在我看来,使用线程休眠往往会创建一个脆弱或缓慢的测试套件。您无法保证环境是否会在特定时间内运行测试。

另外,我建议您不要使用单元测试来检查文件是否已移动。这意味着您的测试依赖于处于特定状态的文件系统,而不是在技术上测试最小的可能事物。

单元测试必须根据定义:-

  • 测试最小的可能单元
  • 不测试超过一件事

您最好使用 Cucumbers 来测试这种行为或其他更高级别的测试类型。或者模拟与文件系统的交互。

于 2013-09-04T20:11:55.510 回答
0

我会设置一个循环,在不睡觉的情况下进行第一次检查(避免不必要的睡眠);如果文件尚不存在,则休眠并重复最多 N 次,如果没有在足够的时间内创建则失败。

于 2013-09-04T19:48:07.480 回答
-1

我同意 Dropkick 的单元测试策略。对于单元测试,是否对环境有依赖;尝试使用 Mock 对象来测试特定环境的情况。

有关使用模拟框架创建单元测试用例的更多信息,请参阅MockitoPowerMock 。

于 2013-09-04T20:20:40.707 回答