如何编写单元测试来测试Thread.Sleep的功能?

时间:2017-08-11 17:07:37

标签: java unit-testing thread-sleep

假设我实现了一个让当前线程休眠10秒的方法。现在我想编写一个单元测试用例来测试这个方法的功能。我怎样才能做到这一点?以下代码是更好的选择吗?

@Test
public void testSleep() {
    long start = System.currentTimeMillis();
    invokeFunction(2000);
    long end = System.currentTimeMillis();
    Assert.assertTrue(end - start > 2000);
}

2 个答案:

答案 0 :(得分:0)

我想说你附上的代码是一个很好的测试,可以测试invokeFunction(2000)的持续时间确实至少需要2000毫秒。但是,它并没有证明该功能大约需要你指定的时间。

@Test
public void testSleep() {
   for(int i=250; i<3000; i+= 250) {
      long start = System.currentTimeMillis();
      invokeFunction(i);
      long end = System.currentTimeMillis();
      Assert.assertTrue(end - start >= i);
      Assert.assertTrue(end - start <= i+ 250);
   }
}

通过这种方式,您可以显示该函数大约花费的时间量,容差为250毫秒。使用原始测试,如果invokeFunction方法被硬编码为休眠5000毫秒,那么您的测试将通过,但实现实际上并不正确。

答案 1 :(得分:0)

我会说这取决于你想要测试的内容。你没有测试函数实际上是否在线程X秒,你正在测试该方法需要至少X秒来完成。

我的意思是,如果函数执行的操作不仅仅是Thread.sleep,那么你正在计算所有的东西。

请注意,我至少说,因为无法保证线程会准确地睡眠这段时间;醒来可能需要更长的时间(jvm会尽力而为)。

但TBH我不知道除了你正在做的任何其他更好的方法,而不是为了能够测试它而改变你的函数实现(比如有一个只有目的的中间组件)只是为了睡眠线程,只是监视进入和退出该组件。)