gpt4 book ai didi

java - 单元测试非阻塞方法(异步测试)

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:30 25 4
gpt4 key购买 nike

我有一个非常简单的 Check 类,它有一个阻塞的 waitForCondition() 方法。这种方法是阻塞的。我想为此方法创建一些单元测试。首先,该方法应在满足条件时返回。其次,该方法应该在中断时返回。

Check 类内部有一个 ArrayBlockingQueue 并调用它的 take() 方法,所以我的测试实际上是关于为条件正确(应该是)。在应用程序中,Check 类的数据由另一个线程通过 InputData 方法提供。 InputData 方法对传入数据执行逻辑,并在满足条件时将虚拟对象放入 ArrayBlockingQueue 中。这应该会导致 waitForCondition() 返回。

所以我的第一个想法是我可以通过模拟测试 InputData 并检查是否在满足条件时将虚拟对象添加到队列中。这将需要更改类的设计,因为队列是私有(private)数据成员(除非可以模拟私有(private)数据)。不是 InputData 在满足条件时直接添加到队列中,而是必须调用可以被模拟的东西。

但是如果 InputData 运行正常,那么检查 waitForCondition() 方法本身就会出现问题。这真的很简单的代码:

try {
myArrayBlockingQueue.take();
return true;
} catch (InterruptedException ex) {
return false;
}

所以我想知道这是否值得想象中的麻烦:一个测试用 Check 创建另一个线程,调用它的 waitForCondition(),然后在它执行时返回一些东西完毕。也许,使用 Executor 服务。模糊的部分是如何同步 assertTrue(...)。我找到了这个 article on asynchronous testing看起来它可能会成功。

问题总结:

  1. 我是否应该更改设计以测试 InputData() 中的逻辑?如果是,如何更改?
  2. 只要测试了 InputData(),我是否应该省略 waitForCondition() 的测试?
  3. 还是只做需要做的事情(有点复杂的单元测试)并直接测试 waitForCondition() 更好?

最佳答案

如果您在 Check 类的构造函数中注入(inject) ArrayBlockingQueue 的实例,那么您的测试可以在测试中间注入(inject)适当的值。

然后您可以运行带有超时的单元测试,如果它没有在 100 毫秒左右的时间内返回则失败。

关于java - 单元测试非阻塞方法(异步测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11435290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com