2016-12-15 9 views
0

問題が発生しましたJUnit 4.12特定の例外をスローするメソッドをテストする際に、私は説明できません。 私は@Testアノテーションを(expected = MyException.class)と使用しています。 MyExceptionは単にExceptionから派生したものです。JUnitテストが予期したとおりに動作しない

によりプログラミングエラー行方不明「スロー」句)にこの例外はがスローされません。 jmockit 1.29を使用して模擬クラスを含むテストケースの設定のため、メソッドの後の方でNullPointerExceptionがスローされます。基本クラスのレイアウトをshwoing

例クラス:

package l00tr.test; 

public class MyException extends Exception { 
    private static final long serialVersionUID = 1L; 
    public MyException(String msg) { 
     super(msg); 
    } 
} 

package l00tr.test; 

import java.util.Map; 
import java.util.Set; 

public class MyClass { 

    private Set<String> testSet; 
    private Map<String, String> testMap; 
    private boolean condition; 

    private MyClass() { 
     this.testSet = null; 
     this.testMap = null; 
     this.condition = false; 
    } 
    private MyClass(Set<String> testSet, Map<String, String> testMap, 
      boolean condition) { 
     this.testSet = testSet; 
     this.testMap = testMap; 
     this.condition = condition; 
    } 
    public void method() throws MyException { 
     if (testSet.size() < 2) { 
      throw new MyException("test set"); 
     } 
     if (!condition) { 
      // FORGOTTEN: throw 
      new MyException("test"); 
     } 
     System.out.print("set size: " + testSet.size()); 
     System.out.print("some more stuff succeeding"); 
     System.out.print("map size: " + testMap.size()); // NullPointerException 
    } 
    public static final class Builder { 
     private Set<String> testSet; 
     private Map<String, String> testMap; 
     private boolean condition; 
     private Builder() { 
      this.testSet = null; 
      this.testMap = null; 
      this.condition = false; 
     } 
     public static Builder newBuilder() { 
      return new Builder(); 
     } 
     public Builder testSet(Set<String> testSet) { 
      this.testSet = testSet; 
      return this; 
     } 
     public Builder testMap(Map<String, String> testMap) { 
      this.testMap = testMap; 
      return this; 
     } 
     public Builder condition(boolean condition) { 
      this.condition = condition; 
      return this; 
     } 
     public MyClass build() { 
      return new MyClass(testSet, testMap, condition); 
     } 
    } 
} 

だから私は、テストは失敗を期待します。しかしそれは成功しました。 "(expected = ...)"のテストアノテーションの一部を削除すると、期待通りにNullPointerExceptionでテストが失敗します。

package l00tr.test; 

import java.util.Set; 
import org.junit.Test; 
import mockit.Expectations; 
import mockit.Mocked; 

public class MyClassTests { 
    @Mocked 
    private Set<String> testSet; 

    @Test(expected = MyException.class) 
    public void testMethod() throws MyException { 
     new Expectations() { 
      { 
       testSet.size(); 
       result = 3; 
      } 
     }; 
     MyClass mc = MyClass.Builder.newBuilder().condition(false) 
       .testSet(testSet).build(); 
     mc.method(); 
    } 
} 

ヤココがこれを見つけ出すのを助けました。そうでなければ、すべてが間違っていると誤って判断しました。また、junit 4.12の未解決の問題も確認しましたが、一致する問題は見つかりませんでした。

テストが成功するのはなぜですか?何か案は?

更新:

私は私のコードの関連する詳細情報を表示する例を改善しました。予想通り残念ながら、上記の貼り付けのコードは、すなわち、エラーを示す、振る舞うん:

java.lang.Exception: Unexpected exception, expected<l00tr.test.MyException> but was<java.lang.NullPointerException> 

私の具体的な開発環境のセットアップはので、ここで、役割を果たしている可能性がいくつかの詳細は以下のとおりです。

  • Gradleの3.2.1でアクティブデーモン
  • のJUnit 4.12
  • jmockit 1.29
  • 食Neon.1aリリース(4.6.1)
  • Javaのバージョン「1.8.0_112」64ビット
  • のWindows 10
+1

あなたの完全なテストを見せてください。あなたはTestCaseから拡張していますか? http://stackoverflow.com/a/5550830/912829 – ACV

+0

@ACVありがとう、私もその答えを見つけました。私は(故意に)TestCaseを拡張しているわけではありません。上のコードはここに収まるように単純化されていますが、私はコード構造をよりよく表示するためにそれを拡張します。 – l00tr

+0

Junit 4アノテーションを使用している場合は、テストケースを拡張する必要はありません。しかし、私はJunit 4でこの問題を再現することはできません。したがって、スタックオーバーフローでポストするコードを要約するには何かがありません。 Junit4によるアノテーションベースの例外チェックでよく起こる "偽陽性"の問題は、実際にテストしようとしていたものではなく、アノテーションを満たすことが予想される例外があった場合です。 –

答えて

0

は有益なコメントの後、私はこの問題は、アノテーションベースの例外を除いて「『偽陽性』の問題に絞り込むことができることを発見しましたJunit4"でチェック:

再び抽象スーパークラスを含む完全なスタックトレースとコードをチェックした後、私はは伐採後MyExceptionに任意の例外を変換するのtry/catchを見つけました。したがって、ツールとコードの観点からは、すべてが期待通りに機能します。

+0

良い取引、あなたはそれを考えてうれしい! –

関連する問題