【发布时间】:2022-02-01 12:18:01
【问题描述】:
我有一个@Async 方法并想用junit 对其进行测试。
问题:我希望 junit 在不阻塞的情况下触发对 async 方法的所有调用,所以不想要结果。
但在我下面的示例中,每个调用首先等待异步方法返回,然后继续下一个 incovation:
@Service
public class MainService {
@Autowired
private SubService sub;
@Async
public void processAsync() {
sub.run();
}
}
@SpringBootTest
public class MainServiceTest {
@Autowired
private MainService service;
@MockBean
private SubService sub;
@Test
public void testAsync() {
final CountDownLatch latch = new CountDownLatch(5);
when(sub.run()).then((answer) -> {
latch.countDown();
latch.await(); //return when latch is 0
return;
}
for (int i = 0; i<6; i++) {
//TODO this currently runs in sync. why?
service.processAsync();
}
}
}
我希望所有服务调用都阻塞,直到闩锁计数达到 0,然后继续测试。
但我得到的是 SubService 只被调用一次,然后卡在模拟的 Answer 方法中。
问题:为什么我在 @Test 方法中的 service.process() 调用没有直接触发 5 次?
【问题讨论】:
标签: java spring-boot junit spring-async