1

@MyTestJUnit 4.11 テストのセットに対して、いくつかの単体テストに適用する独自の注釈 (と呼びましょう) を作成しました。現状では、これらのテストに と の両方で注釈を付ける必要が@Testあります@MyTest- 私が考える最良の解決策ではありません。注釈では継承ができないため、カスタムランナーを構築しようとしましたが、これまでのところ成功していません。これまでの様子は次のとおりです。

public class MyRunner extends Suite {

    public MyRunner(Class<?> klass, RunnerBuilder builder)
            throws InitializationError {
        super(klass, modifyBuilder(builder));
    }

    private static final RunnerBuilder modifyBuilder(RunnerBuilder builder) {
        if(AllDefaultPossibilitiesBuilder.class.isAssignableFrom(builder.getClass())) {    
            return new AllDefaultPossibilitiesBuilder(true) {
                @Override
                public Runner runnerForClass(Class<?> testClass)
                        throws Throwable {
                    List<RunnerBuilder> builders = Arrays.asList(
                            ignoredBuilder(),
                            annotatedBuilder(),
                            suiteMethodBuilder(),
                            junit3Builder(),
                            junit4Builder(),
                            myTestBuilder());

                    for (RunnerBuilder each : builders) {
                        Runner runner = each.safeRunnerForClass(testClass);
                        if (runner != null) {
                            return runner;
                        }
                    }
                    return null;
                }

                private RunnerBuilder myTestBuilder() {
                    return new RunnerBuilder() {

                        @Override
                        public MyAnnotationRunner runnerForClass(Class<?> testClass)
                                throws Throwable {
                            return new MyAnnotationRunner(testClass);
                        }
                    };
                }
            };
        } else {
            return builder;
        }
    }
}

そしてMyAnnotationRunnerクラス:

public class MyAnnotationRunner extends BlockJUnit4ClassRunner {

    public MyAnnotationRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected List<FrameworkMethod> computeTestMethods() {
        return getTestClass().getAnnotatedMethods(MyTest.class);
    }

    @Override
    protected void validateTestMethods(List<Throwable> errors) {
        validatePublicVoidNoArgMethods(MyTest.class, false, errors);
    }
}

@MyTestただし、これまでのところ、テストを実行すると、注釈は気にしません。実際、ビルダーリストの行をコメントアウトすると、junit4Builder(),テストはまったく実行されません。

私は間違った方向に進んでいますか、それともこれは正しい考えですが、これまでのところ不完全ですか? (そして、誰かがそれを提案したい場合に備えて、TestNG または別のテスト フレームワークに切り替えることはできません。)

編集:

解決策 (Bobbo によって提案された) は、上記のコードにはありませんでした - それはすべて正しいようです。@MyTestただし、注釈には注釈がありませんでした@Retention。正しい定義は次のようになります。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest { }
4

1 に答える 1

1

Retention アノテーションを使用して、実行時に MyTest アノテーションが保持されるように設定されていることを確認してください。

@Retention( RetentionPolicy.RUNTIME )
public @interface MyTest {}

それ以外computeTestMethods()の場合はMyAnnotationRunner 、空のリストが返されます。

また、アノテーションが付けられたものも実行したい場合@Testは、メソッドを次のように変更する必要があります。

protected List<FrameworkMethod> computeTestMethods() {
    List<FrameworkMethod> methods = new ArrayList<>(); 
    methods.addAll(getTestClass().getAnnotatedMethods(Test.class));
    methods.addAll(getTestClass().getAnnotatedMethods(MyTest.class));
    return methods;
}

あなたが持っているようにスイートを使用してこれをテストしていませんが、ランナーを使用してテストクラスを実行するだけで、必要に応じて機能するようです:

@RunWith(MyAnnotationRunner.class)
public class Tests {
    @Test
    public void testUsingNormalTestAnnotation() {
        Assert.fail();
    }

    @MyTest
    public void testUsingMyTestAnnotation() {
        Assert.fail();
    }
}
于 2013-11-14T17:49:48.277 に答える