問題が発生しました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
あなたの完全なテストを見せてください。あなたはTestCaseから拡張していますか? http://stackoverflow.com/a/5550830/912829 – ACV
@ACVありがとう、私もその答えを見つけました。私は(故意に)TestCaseを拡張しているわけではありません。上のコードはここに収まるように単純化されていますが、私はコード構造をよりよく表示するためにそれを拡張します。 – l00tr
Junit 4アノテーションを使用している場合は、テストケースを拡張する必要はありません。しかし、私はJunit 4でこの問題を再現することはできません。したがって、スタックオーバーフローでポストするコードを要約するには何かがありません。 Junit4によるアノテーションベースの例外チェックでよく起こる "偽陽性"の問題は、実際にテストしようとしていたものではなく、アノテーションを満たすことが予想される例外があった場合です。 –