如何在单元测试中避免Thread.sleep?

2022-09-02 04:40:34

让我们想象一下,我有以下应该测试的方法:

@Autowired
private RoutingService routingservice;

public void methodToBeTested() {
    Object objectToRoute = initializeObjectToRoute();
    if (someConditions) {
         routingService.routeInOneWay(objectToRoute);
    } else {
         routingService.routeInAnotherWay(objectToRoute);
    }
}

在本例中,在单独的线程中运行,因此在其构造函数中,我们有以下内容:RoutingService

Thread thread = new Thread(this);
thread.setDaemon(true);
thread.start();

问题是,它改变了状态,这正是我想要检查的,但这不会立即发生,因此测试失败。但是,如果我添加,那么它有效,但据我所知,这是不好的做法。RoutingServiceobjectToRouteThread.sleep()

在这种情况下,我该如何避免?Thread.sleep()


答案 1

如果你正在为该方法测试[单元测试],你应该简单地模拟。
您不应该测试任何调用的方法。methodToBeTestedroutingservicemethodToBeTested

但是,听起来你想测试(你说“问题是改变了状态,这正是我想检查的”)。RoutingServiceRoutingServiceobjectToRoute

若要测试方法,应为这些方法编写单独的单元测试。RoutingService


答案 2

我建议等待同步异步测试。例如,假设您有一个在进行某些线程操作后设置的结果对象,并且您希望对其进行测试。你这样写语句:

 await()
.atMost(100, TimeUnit.SECONDS)
.untilAsserted(() -> assertNotNull(resultObject.getResult()));

它最多等待 100 秒,直到满足断言。例如,如果 getResult() 在 0-100 秒之间返回一些不为 null 的内容,则执行将继续,这与 Thread.sleep 不同,Thread.sleep 会在给定时间内保持执行,无论结果是否存在。


推荐