Java 如何测试比瞬时运行慢的方法?

Java 如何测试比瞬时运行慢的方法?,java,unit-testing,testing,junit,Java,Unit Testing,Testing,Junit,我有这样一种情况,调用一个方法会返回一个错误,但只会在一段时间后返回(它会轮询一个外部服务一段时间,如果失败会返回一个错误) 我可以对这个场景进行单元测试吗?测量方法执行时间并将其与某个值进行比较的测试是否有效 StopWatch stopWatch = new StopWatch(); stopWatch.start(); myService.do(1000); // argument is a timeout in ms stopWatch.stop(); ... assertTrue(

我有这样一种情况,调用一个方法会返回一个错误,但只会在一段时间后返回(它会轮询一个外部服务一段时间,如果失败会返回一个错误)

我可以对这个场景进行单元测试吗?测量方法执行时间并将其与某个值进行比较的测试是否有效

StopWatch stopWatch = new StopWatch();
stopWatch.start();
myService.do(1000); // argument is a timeout in ms
stopWatch.stop();

...

assertTrue(stopWatch.getTime() >= 1000);
您可以使用存根对测试不感兴趣的服务部分


在一个单元测试中,您可以模拟外部服务,使其花费很长时间,以便测试您是否得到预期的错误。

您的测试在某种程度上是有效的,但它不是最佳的,原因有两个:

  • 时间的流逝有多种原因,因此(正如您使用
    =
    所揭示的那样),您无法准确地测试等待逻辑,只能大致测试
  • 一秒钟是很长的时间。缓慢的测试会拖累团队
通过等待1毫秒而不是1000毫秒,您可以很容易地解决第二个问题,但是您几乎无法判断等待逻辑是否正常工作


我会存根你调用的方法来测量时间的流逝(例如,
System.currentTimeMillis
),并模拟你调用的方法来等待(例如,
Thread.sleep
),这样你的测试显示你的等待逻辑是正确的,但你实际上不必等待。

你的意思是“轮询”,而不是“池”,“是吗?”戴夫·施魏斯格斯:当然。如果你认为有问题,欢迎你编辑我的帖子。一般来说我会的,但如果我错了,我不想改变你问题的意思。@Dave_Schweisguth哦,明白了。谢谢你指出错误!我不能嘲笑正在测试的方法。等待是经过测试的方法执行的结果-它多次尝试访问外部服务(被模拟并在调用时返回错误)。我在回答中更加明确了我的意思。模拟外部服务,而不是被测试的方法。你不想嘲笑正在测试的方法,因为你没有测试它@罗布看起来我们的评论有点不对劲。看看我的意思现在是否清楚了。