2017-12-07 5 views
0

Angenommen, ich habe eine Klasse SomeClass mit einer Methode void process(). Die Implementierung dieser Methode ist ähnlich wie new Thread(this::someOtherMethod).start (nur someOtherMethod in einem bestimmten Thread ausführen).Warten auf eine Methodenausführung

mit einer Unit-Test für diese Methode abgewertet:

SomeClass class= new SomeClass(anObjectToWorkWith); class.process(); assertEquals(expectedObj, anObjectToWorkWith)

I erkannt haben, dass, wenn die process Verfahren in einem bestimmten Thread ausführt, eine assertEquals Anweisung vor der process aufgerufen Verfahren abgeschlossen ist.

Daher habe ich eine Frage: Gibt es eine Möglichkeit, auf die process Methodenausführung zu warten, um assertEquals unbedingt nach der process aufrufen zu müssen.

Vielen Dank im Voraus.

P.S. Stellen Sie keine Lösungen vor, die die Methode Thread.sleep oder Lösungen verwenden, die eine Implementierung der Schnittstelle SomeClassRunnable erfordern, da diese Lösungen nicht der Aufgabenstellung entsprechen.

+0

Wenn Sie class.process() die Thread-Instanz zurückgeben, kann der aufrufende Thread t.join() aufrufen. Das wird warten, bis der Unterfaden fertig ist. – bhspencer

+0

@bhspencer die Sache ist, dass die SomeClass-Klasse eine Schnittstelle mit einer 'void process()' Methode implementiert, weshalb ich mit solchen Lösungen begrenzt bin. – draft

+0

In diesem Fall könnten Sie der Instanz von SomeClass eine weitere Methode namens wait() hinzufügen. Sei der Thread ein Mitglied von SomeClass und in wait() rufe t.join() auf; – bhspencer

Antwort

2

Sie haben einfach hart Code hier zu testen.

Wenn der zu testende Code eine neue Thread-Instanz erstellt und diese verwendet - dann gibt es einfach keine gute Möglichkeit, sinnvolle Komponententests zu schreiben.

Stattdessen: Ändern Sie den zu testenden Code.

Zum Beispiel: Anstatt Low-Level-Threads zu verwenden, wechseln Sie zu einem ExecutorService. Und dann verwenden Sie einen same thread executor für Ihre Tests. Dadurch können Sie Ihr Multithreading-Problem in ein Single-Threading-Problem verwandeln. Nur mit einer anderen Art von Executor.

+0

Dies. Testen Sie das intern erstellte "Runnable", um das Ergebnis erstellen zu können, das ohne Nebenläufigkeit ausgeführt werden soll, was Sie am besten können. – daniu