2012-06-18 2 views
5

Wie im Titel, ich möchte eine Methode wie folgt testen:Wie Unit-Test eine Methode, die einfach einen Thread mit jUnit startet?

public void startThread() 
{ 
    new Thread() 
    { 
     public void run() 
     { 
      myLongProcess(); 
     } 
    }.start(); 
} 

EDIT: nach zu urteilen Kommentare Wenn ein Thread beginnt zu testen oder nicht, ich denke, es ist nicht sehr verbreitet. Also muss ich die Frage anpassen ... Wenn meine Anforderung 100% Codeabdeckung ist, muss ich testen, ob dieser Thread startet oder nicht? Wenn ja, brauche ich wirklich einen externen Rahmen?

+2

Ich denke, das wäre hier nützlich: http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code –

+0

Ich habe meine Lösung hier veröffentlicht: [Link Beschreibung hier eingeben] (http://StackOverflow.com/A/39525700/3016686) –

Antwort

6

Dies kann elegant mit Mockito erfolgen. Unter der Annahme, die Klasse mit dem Namen wird ThreadLauncher Sie die startThread() Methode in einem Aufruf von myLongProcess() mit resultierten gewährleisten kann:

public void testStart() throws Exception { 
    // creates a decorator spying on the method calls of the real instance 
    ThreadLauncher launcher = Mockito.spy(new ThreadLauncher()); 

    launcher.startThread(); 
    Thread.sleep(500); 

    // verifies the myLongProcess() method was called 
    Mockito.verify(launcher).myLongProcess(); 
} 
+1

Ich würde in Betracht ziehen, die Klasse unter Test zu verspotten oder auszuspionieren eine schlechte Praxis.Stellen Sie stattdessen sicher, was 'myLongProcess' tut. Es muss etwas tun, es zu überprüfen. Wenn es anruft für andere Klasse, Mock diese Klasse, um den Anruf zu überprüfen –

+1

Mein Verständnis der Frage ist, dass er testen will, ob die 'startThread()' Meth Es ist Aufgabe, einen Thread zu starten. Er fragt nicht, wie man das Ergebnis von 'myLongProcess()' testet, ich nehme an, er weiß bereits, wie man das macht. –

+0

Danke, siehe BEARBEITEN. – mt22

1

Wenn Sie 100% ige Abdeckung benötigen, müssen Sie startThread nennen, die einen Thread Auftakt. Ich empfehle eine Art Verifizierung, dass der Thread gestartet wurde (indem Sie überprüfen, ob etwas in myLongProcess passiert, dann bereinigen Sie den Thread. Dann würden Sie wahrscheinlich den Rest des Tests für myLongProcess durchführen, indem Sie diese Methode direkt aus Ihrem Komponententest aufrufen.

Verwandte Themen