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

Pet*_*ete 5 java multithreading unit-testing

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

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

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

但是waitForCondition(),如果InputData功能正常,则存在检查方法本身的问题。它实际上是简单的代码:

try {
        myArrayBlockingQueue.take();
        return true;
    } catch (InterruptedException ex) {
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否值得想象的麻烦:一个测试创建一个带有的另一个线程Check,调用waitForCondition(),然后在完成后返回结果。也许,使用执行器服务。模糊部分是如何同步assertTrue(...)。我发现这篇关于异步测试的文章似乎可以解决问题。

问题摘要:

  1. 我应该更改设计以测试其中的逻辑InputData()吗?
  2. 我应该保留测试的waitForCondition()时间InputData()吗?
  3. 还是只做需要做的事情(有点复杂的单元测试)并waitForCondition()直接测试更好?

Sea*_*lly 3

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

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