gpt4 book ai didi

java - 如何jUnit测试另一个线程中代码的结果

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:37 26 4
gpt4 key购买 nike

我有一个在线程中运行的进程(用作实时信号分析进程)。我想为该线程进程提供一个已知输入,然后在 jUnit 中测试输出是否正确。我有一个回调监听器,它可以在线程完成数据处理时通知我,并且我可以通过将测试用例本身注册为监听器来成功地对结果运行断言。
当这些断言失败时,它们会抛出异常。但是这个异常并没有被 jUnit 注册为失败,大概是因为它们发生在测试方法之外。

如何构建我的 jUnit 测试,以便在监听器返回后测试正确失败?这是代码的简化版本。

 public class PitchDetectionTest extends TestCase 
implements EngineRunCompleteListener() {
AudioData fixtureData;
PitchDetectionEngine pitchEngine;

public void setUp() {
fixtureData = <stuff to load audio data>;
}

public void testCorrectPitch() {
pitchEngine = new PitchEngine(fixtureData);
pitchEngine.setCompletionListener(this);
pitchEngine.start();
// delay termination long enough for the engine to complete
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
}

// gets called by the PitchEngine when it has finished processing all data in the
// fixtureData. This is the only method defined by interface
// EngineRunCompleteListener.
public void notifyEngineRunComplete() {

// The real code asserts things about the PitchEngine's results. When they fail,
// an exception is thrown that I can see in the console, but this unit test still
// shows as 'success' in the jUnit interface. What I want is to see
// testCorrectPitch() fail.
assertTrue(false);

}

}

public class PitchEngine () {
EngineRunCompleteListener completionListener();
Thread myThread;

public void start() {
// other stuff
myThread = new Thread(this);
myThread.start();
}

public void run() {
while (some condition) {
// do stuff with the data
}
if (engineRunCompleteListener != null) {
engineRunCompleteListener.notifyEngineRunComplete();
}
}

}

最佳答案

您已经有两个线程在运行。您的 junit 线程和进程线程(由 myThread.start() 启动。
在我的脑海中,我可以想到至少两个选项,所有选项都涉及将断言从 notifyEngineRunComplete 移开。例如:

  • 您可以使用join 等待进程线程完成,然后进行断言(Javadoc here)。
  • 您可以通过等待监视器对象让您的 junit 线程 hibernate ,然后在您的回调函数中通知该监视器。这样您就会知道流程已经完成。
  • 您可以使用ExecutorFuture 对象。我认为如果它适用于您的类 (Javadoc here),这将是最酷的解决方案。

关于java - 如何jUnit测试另一个线程中代码的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531608/

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