У меня есть процесс, который выполняется в потоке (используется как процесс анализа сигнала в реальном времени). Я хочу передать этот поток процессу известному входу, а затем проверить - в 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 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();
}
}
}