2017-02-25 5 views
2

Ich habe ein folgendes einfaches JAVA-Programm namens SequenceExample, die drei Methoden in der Reihenfolge ausführt:JUNIT - Testen die Folge von Methoden

  1. Waschen()
  2. Trocknung()
  3. Folding()

Ich möchte einen JUNIT-Test schreiben, der sicherstellt, dass diese Sequenz beibehalten wird. Mit anderen Worten, in Zukunft, wenn der Code geändert wird, um Drying() vor Washing() auszuführen, dann sollte mein JUNIT fehlschlagen und eine Nachricht geben, dass "Laundry Sequence ist nicht in Ordnung"

Bitte lassen Sie mich wissen, wenn Sie eine Ahnung haben, wie dies zu erreichen . Danke, Dayanand.

public class SequenceExample { 

    public static void main(String[] args) { 

     //Shows Sequential Steps for laundry 

     Washing(); //Sequence#1 
     Drying(); //Sequence#2 
     Folding(); //Sequence#3 
    } 

    private static void Washing(){ 
     System.out.println("Washing - This is Step One of Laundry"); 
    } 

    private static void Drying(){ 
     System.out.println("Drying - This is Step Two of Laundry"); 
    } 

    private static void Folding(){ 
     System.out.println("Folding - This is Step Three of Laundry"); 
    } 
} 

Antwort

1

Ich denke, dass diese Überprüfung im Code durchgeführt werden sollte. Andernfalls könnte der Code-Client eine nicht akzeptable Sequenz zulassen.
In dem Unit-Test können Sie überprüfen, ob die SequenceExample Klasse Verhaltensweisen wie erwartet:

  • , wenn die Sequenz gültig ist, wird keine Ausnahme gestiegen.
  • Wenn die Sequenz nicht gültig ist, verhindert eine Ausnahme, dass der Clientcode ausgeführt wird.

Einige Hinweise:

1) Sie nisten viele Dinge in SequenceExample und Instanz SequenceExample nicht verwendet. Sie sollten Instanzen und Instanzmethoden bevorzugen, wenn Sie keine Hilfsmethoden schreiben. wash, trocken und fold und nicht Waschen, Trocknen und Folding:

2) Verfahren Namen sollten Verb im Infinitivform (Konventionen) sein.

3) Jede Methode hat ein bestimmtes Verhalten und sollte von einem Client-Code aufgerufen werden können. Sie privat zu machen, erscheint nicht wünschenswert.

4) Sie könnten ein Feld in SequenceExample einführen, das den aktuellen Zustand beibehält. Ein Java Enum könnte die Aufgabe erledigen.
Jede Methode konnte den Zustand vor der Ausführung ihrer Aufgabe überprüfen und eine Ausnahme auslösen, wenn der Zustand nicht der erwartete ist.
Und am Ende der Methode wird der Zustand geändert werden. Hier

ist eine modifizierte Version der Klasse:

public class SequenceExample { 

    public enum State { 
     WASHING, DRYING, FOLDING, 
    } 

    private State state; 

    public static void main(String[] args) { 
     // Shows Sequential Steps for laundry 
     SequenceExample sequenceExample = new SequenceExample(); 
     sequenceExample.wash(); // Sequence#1 
     sequenceExample.dry(); // Sequence#2 
     sequenceExample.fold(); // Sequence#3 
    } 

    public void wash() { 
     if (state != null) { 
      throw new IllegalStateException("state should be null"); 
     } 
     System.out.println("Washing - This is Step One of Laundry"); 
     state = State.WASHING; 
    } 

    public void dry() { 
     if (state != State.WASHING) { 
      throw new IllegalStateException("state should be WASHING"); 
     } 
     System.out.println("Drying - This is Step Two of Laundry"); 
     state = State.DRYING; 
    } 

    public void fold() { 
     if (state != State.DRYING) { 
      throw new IllegalStateException("state should be WASHING"); 
     } 
     System.out.println("Folding - This is Step Three of Laundry"); 
     state = State.FOLDING; 
    } 
} 

Hier ist eine Testklasse mit einem Test, der die Methoden in der guten Ordnung und 3 Tests, die für eine Ausnahme nicht und so warten ruft steigend.

import org.junit.Test; 

public class SequenceExampleTest { 

    SequenceExample sequenceExample = new SequenceExample(); 

    @Test 
    public void sequenceCorrect() throws Exception { 
     sequenceExample.wash(); 
     sequenceExample.dry(); 
     sequenceExample.fold(); 
    } 

    @Test(expected = IllegalStateException.class) 
    public void sequenceNotCorrectCaseOne() throws Exception { 
     sequenceExample.dry(); 
     sequenceExample.wash(); 
    } 

    @Test(expected = IllegalStateException.class) 
    public void sequenceNotCorrectCaseTwo() throws Exception { 
     sequenceExample.dry(); 
     sequenceExample.fold(); 
    } 

    @Test(expected = IllegalStateException.class) 
    public void sequenceNotCorrectCasethree() throws Exception { 
     sequenceExample.wash(); 
     sequenceExample.fold(); 
    } 
} 
0

sollten Sie in der Lage sein Mockito nutzen auf Ihrem Testperson auszuspionieren und überprüfen die Methoden in der erwarteten Reihenfolge genannt wurden.

@Test 
public void laundry() { 

    // given 
    Laundry subject = spy(new Laundry()); 

    // when 
    subject.wash(); 
    subject.dry(); 
    subject.fold(); 

    // then 
    InOrder inOrder = inOrder(subject); 
    inOrder.verify(subject).wash(); 
    inOrder.verify(subject).dry(); 
    inOrder.verify(subject).fold(); 
} 

Wenn aus irgendeinem Grunde, ein zukünftiger Entwickler denkt, es ist eine kluge Idee, nasse Wäsche zu falten, dann wird der Test mit dem folgende Signal fehlschlagen:

org.mockito.exceptions.verification.VerificationInOrderFailure: 
Verification in order failure 
Wanted but not invoked: 
laundry.fold(); 
-> at LaundryTest.laundry(LaundryTest.java:24) 
Wanted anywhere AFTER following interaction: 
laundry.dry(); 
-> at LaundryTest.laundry(LaundryTest.java:18) 
Verwandte Themen