0

我想对我的函数的行为进行单元测试,该函数使用对外部 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() 放在我的测试中以强制它等待

这些都没有奏效,我很茫然。任何人都可以帮忙吗?

4

0 回答 0