我有一种情况,调用方法会返回一个错误,但只在一段时间后(它会轮询外部服务一段时间,如果失败则会返回错误)。
我可以对这种情况进行单元测试吗?测试有效,测量方法的执行时间并将其与某个值进行比较吗?
StopWatch stopWatch = new StopWatch();
stopWatch.start();
myService.do(1000); // argument is a timeout in ms
stopWatch.stop();
...
assertTrue(stopWatch.getTime() >= 1000);
答案 0 :(得分:2)
你的测试有点有效,但由于两个原因它并不是最佳的:
>=
的使用所揭示的那样)您无法准确地测试您的等待逻辑,只是大约。您可以通过等待1 ms而不是1000来轻松解决第二个问题,但是您几乎无法判断等待逻辑是否正常工作。
我会把你正在调用的方法用来衡量时间的推移(例如System.currentTimeMillis
)并模拟你要求等待的方法(例如Thread.sleep
),这样你的测试就会显示出来你的等待逻辑是正确的,但实际上你不必等待。
答案 1 :(得分:1)
您可以使用Mockito来存储您不想测试的部分服务。
在一个单元测试中,您可以模拟外部服务以使其花费很长时间,以便您可以测试是否得到预期的错误。