2017-02-25 5 views
2

の一連のテスト:JUNIT - 私は順番に3つのメソッドを実行しSequenceExampleと呼ばれる次のような単純なJavaプログラムを持っている方法

  1. 洗濯()
  2. 乾燥()
  3. 折りたたみ()
は、

このシーケンスが確実に維持されるようにJUNITテストを作成したいと思います。将来的には他の言葉でコードがWashing()Drying()を実行するために変更された場合、その後の私のJUNITは「ランドリーシーケンスが順序ではありません」というメッセージを失敗し、与えるべき

あなたがこれを達成するためにどのように任意のアイデアを持っているなら、私に知らせてください。 。 ありがとう、 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"); 
    } 
} 

答えて

1

このチェックはコードで実行する必要があります。さもなければ、コードクライアントは受け入れられないシーケンスを許すかもしれません。あなたは予想通りSequenceExampleクラスの振る舞いをすることを確認することができ、ユニットテストで

  • シーケンスが有効である場合、例外が上がっていません。
  • シーケンスが有効でない場合、例外によってクライアントコードが実行されなくなります。

いくつかのヒント:SequenceExample

1)あなたの巣多くのことをしてSequenceExampleのインスタンスを使用していません。ユーティリティメソッドを記述しない場合は、インスタンスとインスタンスメソッドを優先してください。

2)メソッド名は不定詞形(規則)で動詞でなければならない:洗浄ドライなく、洗浄、乾燥、折り畳み。

3)各メソッドには特定の動作があり、クライアントコードから呼び出し可能である必要があります。それらを非公開にすることは望ましくないようです。

4)SequenceExampleに、現在の状態を維持するフィールドを導入することができます。 Java enumがその仕事をすることができます。
各メソッドは、そのタスクを実行する前に状態をチェックし、状態が期待どおりでない場合は例外をスローすることができます。
メソッドの最後に状態が変更されます。ここで

は、あなたのクラスの修正版である:ここで

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; 
    } 
} 

は良い順にメソッドと例外を待たずしてそう 3のテストを呼び出すテストとテストクラスであります上昇する。

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

あなたは、被験者をスパイとメソッドが予想されるために呼ばれた検証するMockitoを活用することができるはずです。何らかの理由で、将来の開発者はそれが濡れた洗濯物を折るために賢明だと思った場合

@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(); 
} 

、テストは、次の信号で失敗します:

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) 
関連する問題