我想对我的函数的行为进行单元测试,该函数使用对外部 API 的异步调用(使用 WebClient,但我怀疑它是否相关)。函数流程的简化版本是这样的
fun foo() {
if (conditionIsMet) {
thread(start = true) {
externalApi.post()
}
} else {
println("Hello World")
}
}
因此,在我的测试文件中,我有 2 个测试,分别测试两个 if 分支。
在满足条件的测试中,我使用 MockWebServer 模拟了外部 API 调用,然后使用Awaitility等待调用结束
await().untilAsserted {
verify { externalApi.post() }
}
在另一项测试中,我检查是否未进行此调用:
verify (exactly = 0) { externalApi.post() }
当我分别运行这两个测试时,它们都可以顺利运行。当我同时运行它们时会出现问题(我运行文件的所有测试,方式相同maven test
)。然后,我的第二个测试失败了,可能是因为它看到了另一个测试中的调用。
我不熟悉线程中的执行上下文,所以我对正在发生的事情有一个浅薄的了解
我尝试过的:
- 锁定我的测试函数,将其锁定在 @BeforeEach 并在 @AfterEach 解锁,以便它们按顺序运行
- 在我的代码中用协程替换线程
- 天真地将 Thread.sleep() 放在我的测试中以强制它等待
这些都没有奏效,我很茫然。任何人都可以帮忙吗?