jUnit テストの使用と Java での例外処理に問題があります。appengine-web.xml ファイルで構成されたいくつかのプロパティを使用するメソッドをテストする必要があるため、@RunWith (DevAppServerTestRunner.class) と @DevAppServerTest (TestConfig.class )の両方のアノテーションを使用して TestClass を作成しました。
問題は、jUnit @Ruleを宣言してテストしたい例外を定義した後、テストを実行し、「ルール ' myexceptionName ' は MethodRule または TestRule を実装する必要があります」というエラーが発生したときに発生します。
私が宣言した例外は、既に TestRule を実装している jUnit クラスであるExpectedException型であるため、これはかなり奇妙です。この問題は、@RunWithおよび@DevAppServerTestアノテーションと関係があると思われます。これらのアノテーションを使用せずに別のクラスを使用すると、ルールの実装が機能するためです (appengine-web.xml からいくつかのプロパティを読み取る必要があるため、使用できない解決策)。
誰かが似たようなことに遭遇したか、これに対処する方法の手がかりを持っていましたか?
@RunWith(DevAppServerTestRunner.class)
@DevAppServerTest(TestConfig.class)
public class myTestClass {
@Rule
public ExpectedException exc = ExpectedException.none();
@Test
public void TestingException() throws Exception {
this.exc.expect(NullPointerException.class);
String test = null;
test.length();
}
}
ここに書いたサンプル コードには appengine システム プロパティは含まれていませんが、次の同じエラーが発生します。
org.junit.internal.runners.rules.ValidationError: The @Rule 'exc' must implement MethodRule or TestRule.
at org.junit.internal.runners.rules.RuleMemberValidator$FieldMustBeARule.validate(RuleMemberValidator.java:234)
at org.junit.internal.runners.rules.RuleMemberValidator.validateMember(RuleMemberValidator.java:99)
at org.junit.internal.runners.rules.RuleMemberValidator.validate(RuleMemberValidator.java:93)
at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:196)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:129)
at com.google.appengine.tools.development.testing.DevAppServerTestRunner.collectInitializationErrors(DevAppServerTestRunner.java:102)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at com.google.appengine.tools.development.testing.DevAppServerTestRunner.<init>(DevAppServerTestRunner.java:74)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:525)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)