Testen des Verhaltens der void-Methode

8

Angenommen, ich habe das folgende Serviceobjekt

%Vor%

Ich möchte das Verhalten der Methode "addUser" testen, wenn die Länge des Benutzernamens weniger als 8 ist und der Benutzername mehr als 8 Zeichen lang ist. Wie geht man in Unit-Test UserService.addUser (...), und überprüfen Sie es? Mir ist bekannt, Asser (), aber der Wert "Passwort" ist nicht verfügbar außerhalb der addUser (...) -Methode.

Ich benutze JUnit und Mockito.

    
Gama Ogi Prayogo 11.01.2012, 15:23
quelle

6 Antworten

6

Ich habe eine Lösung gefunden, nachdem ich das Problem nach einigen Monaten erneut untersucht habe.

Die Idee besteht darin, den Objektbenutzer zu beobachten, der an UserDao übergeben wird. Wir können den Wert des Benutzernamens dadurch überprüfen, daher der Unit-Test-Code:

%Vor%

Guillaume hatte tatsächlich die nächste Antwort, aber er antwortete mit jMock. Er gab mir jedoch die Idee, wie das zu erreichen ist, also denke ich, dass er auch etwas Anerkennung verdient.

    
Gama Ogi Prayogo 02.07.2012, 09:16
quelle
1

Sie testen Nebenwirkungen, aber glücklicherweise wird alles, was Sie brauchen, an die dao.save () übergeben. Erstellen Sie zuerst ein UserDao (entweder mit oder ohne Mockito), dann können Sie ReflectionTestUtils , um den Dao im UserService zu setzen, dann können Sie die Werte testen, die an dao.save () übergeben werden.

Etwas wie:

%Vor%

Oder du kannst Mockito benutzen, um das Dao zu verspotten, wenn du willst.

    
Matthew Farwell 11.01.2012 15:37
quelle
1

Verwenden Sie ein spöttisches Framework. Das folgende Beispiel verwendet JMock2 , aber es wäre ähnlich mit EasyMock , Mockito usw. Außerdem müssen Sie die Username-Generation zu etwas wie UsernameGenmerator extrahieren, um es zu verspotten. Sie benötigen einen anderen spezifischen Test für den Benutzernamengenerator.

%Vor%

Und für UsernameGenerator müssen Sie die Länge des zurückgegebenen Benutzernamens testen:

%Vor%

Abhängig von Ihrer "zufälligen" Methode möchten Sie natürlich auch sein spezifisches Verhalten testen. Abgesehen davon, bieten die oben genannten eine gute Abdeckung für Ihren Code.

    
Guillaume 11.01.2012 15:55
quelle
0

Es hängt alles davon ab, wie die Speichermethode Ihres DAO implementiert wird.

Wenn Sie tatsächlich in einem fest codierten Repository speichern, müssen Sie wahrscheinlich das Repository selbst nach den Werten abfragen, für die Sie interessiert sind.

Wenn Sie eine zugrunde liegende Schnittstelle haben, die aufgerufen wird, dann sollten Sie in der Lage sein, eine Callback-Methode einzurichten und den tatsächlichen Wert abzurufen, der gespeichert wird.

Ich habe Mockito nie benutzt, also konnte ich Ihnen keinen genauen Code geben, auf den dieser Artikel sich beziehen sollte:

Mit Mockito, Wie kann ich ein Callback-Objekt auf eine void-Methode abfangen?

    
Derek Van Cuyk 11.01.2012 15:43
quelle
0

Ziehen Sie das Extrahieren der Logik zur Generierung von Benutzernamen als Abhängigkeit von UserService in Betracht.

%Vor%

Draht UserNameGenerator ist gleich wie UserDao . Und ändern Sie den Code in:

%Vor%

Erstellen Sie als Nächstes die Standardimplementierung von UserNameGenerator und verschieben Sie die Logik zum Erzeugen von Namen dort.

Jetzt können Sie das Verhalten leicht überprüfen, indem Sie UserNameGenerator und UserDao verspotten.

Um den Anwendungsfall zu überprüfen, wenn der Benutzername die Länge <8>

hat %Vor%

Um den Anwendungsfall zu überprüfen, wenn Benutzername die Länge größer als 8 ist

%Vor%     
Mairbek Khadikov 11.01.2012 15:45
quelle
-1

Am einfachsten ist es, den Teil zu extrahieren, in dem Sie die Logik für die Logik zur Benutzernamen-Namensgebung haben

%Vor%

in eine Methode ein und testen Sie den Rückgabewert dieser Methode.

%Vor%

Damit können Sie verschiedene Arten von Benutzernamen übergeben und das Verhalten Ihres Codes testen.

    
derdo 11.01.2012 15:36
quelle

Tags und Links