用Thread.sleep()进行Camel测试

时间:2013-09-04 13:30:59

标签: java unit-testing junit integration-testing apache-camel

"Camel in action"书中,我找到了这个测试示例:

@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 个答案:

答案 0 :(得分:1)

我同意Big Al。你不应该使用Thread.sleep如果你可以避免它(如果你这样做)(在测试前端行为时这种情况很常见)你肯定想循环一段时间而如果它没有在X中完成则会失败毫秒。

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

另外,我建议您不要使用单元测试来检查文件是否已被移动。这意味着您的测试依赖于文件系统是一个特定的状态,并且在技术上不是测试最小的东西。

单元测试必须按照定义: -

  • 测试最小的单位
  • 不测试多件事

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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

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