2016-12-08 11 views
0

内部でメソッド呼び出ししか持たないif else節をテストしなければならないときに問題が発生しました。JUnitとMockitoを使ってメソッドが別のクラスへのメソッド呼び出しを行うかどうかを調べる方法を教えてください。

public CLI(String[] input){ 
    cliCheck(input); 
} 

public static void cliCheck(String[] input){ 
    if (input.length == 0) { 
     System.out.println("No input"); 
     Help.help(); 
     System.exit(0); 
    } 
    if(input.length == 1){ 
     if(input[0] .equals("help") || input[0] == "-h") { 
      Help.help(); 
      System.exit(0); 
     } 
    } 
    inputParser(input); 
} 

コマンドラインインターフェイスプログラムの先頭部分のコードです。

入力がない場合、最初のifがtrueです。 ユーザーが "help"または "-h"を入力すると、2番目のifがtrueになります。 そうでない場合、入力文字列はinputParserメソッドのパラメータとして送信されます。これは私がこれまで持っているものである

...

@Test 
public void cliCheckTest_Help(){  

    String[] input = {"help"}; 

    CLI cli = new CLI(input); 

    Help help = mock(Help.class); 
    cli.cliCheck(input); 
    verify(help, times(1)).help(); 
} 

答えて

0

問題は、あなたがハードに作成され(100%の分岐カバレッジをテストするためのより良い方法がある私に教えてください)テストコードはこちら。

System.exit()への呼び出しは、あなたの単体テストを非常に不愉快な方法で解体することがわかります。

あなたは代わりにそのようなこと行うことができます:

public interface ShutdownService { 
    public void systemExit(); 
} 

をして、単にSystem.exit()を呼び出し、「デフォルト」の実装を作成します。

しかし、単体テストでは、そのインターフェイスの模擬バージョンを「挿入」することができます。それを使用して、予想されるコールが行われたことを確認します。

これ以外にも、あなたのコードは、という静的メソッドがあるという事実から始めて、テストを必要以上に困難にする他のことも行っています。 静的フィールドinputParserを使用します。

ロングストーリーショート:スタティックが便利に見えるかもしれませんが、合理的な単体テストを書く能力が非常に低下します。

私の助言:作成する方法テスト可能コードを作成する方法を学ぶ;例えば、これらを見て、videos生産コードのデザインを改善してください。それで、筆記テストがはるかに簡単になることがわかります!

そして、それを越えて:コマンドラインオプションの合理取り扱いはここにあなたの素朴な実装よりもはるかに複雑です。これが学習目的でない限り:ではなく、はホイールを再発明します。この種の仕事をするライブラリがあります。それらの1つを使用してください!

関連する問題