1

を実装して独自の JUnit-Runner をorg.junit.runner.Runner作成し、-Annotation を使用して UnitTests を実行できるようにしました@RunWith

次のようになります。

public class MyRunner extends Runner {

    private Context myContext;
    myContext.init();
    private final BlockJUnit4ClassRunner runner;

    public MyRunner(final Class<?> clazz) throws InitializationError {
        myContext = new Context();

        runner = new BlockJUnit4ClassRunner(clazz);
    }

    @Override
    public void run(final RunNotifier notifier) {
        runner.run(notifier);
    }

    @Override
    public Description getDescription() {
        return runner.getDescription();
    }

    public void filter(final Filter filter) throws NoTestsRemainException {
        runner.filter(filter);
    }
}

MyContextリソースをクリーンアップするには、 を呼び出してシャットダウンする必要がありMyContext.close()ます。テストの実行後にリソースがクリーンアップされるようにするには、どこでこれを呼び出す必要がありますか?

4

2 に答える 2

1

何を達成しようとしているのかはわかりませんが、すでにJUnit のRulesを見たことがありますか?

public class MyContextRule extends ExternalResource {

    private final Context myContext;

    public MyContextRule()  {
        myContext = new Context();
    }

    @Override
    protected void before() throws Throwable {
        myContext.init();
    }

    @Override
    protected void after() {
        myContext.close();
    }

}

使用法:

public class MyTest {
    @ClassRule
    public static MyContextRule contextRule = new MyContextRule(); 

    //...
}

s に対するJUnitRuleの利点Runnerは、ランナーを 1 つしか持てないのに対し、それらを複数持つことができることです。

したがって、カスタムRuleは、将来遭遇する可能性のあるランダムなテストフレームワークによって導入される可能性のある任意のランナーで使用できます...

于 2016-11-18T16:34:16.773 に答える
-1

テストの実行後にリソースがクリーンアップされるようにするには、どこでこれを呼び出す必要がありますか?

私の答えを更新org.junit.runner.notification.RunListenerしました。以下に示すように使用できます。

(1) 独自の RunListener クラスを作成します。

public class MyRunnerListener extends RunListener {
    private Context context;

    public MyRunnerListener(Context context) {
        this.context = context;
    }

     void   testRunFinished(Result result)  {
          context.close();
     }
}

(2) MyRunner 内で MyRunnerListener を使用します。

public class MyRunner extends Runner {

    private Context myContext;
    MyRunnerListener runnerListener;
    private final BlockJUnit4ClassRunner runner;

    public MyRunner(final Class<?> clazz) throws InitializationError {
        myContext = new Context();
        myContext.init();
        runnerListener = new MyRunnerListener(myContext);

        runner = new BlockJUnit4ClassRunner(clazz);
    }

    @Override
    public void run(final RunNotifier notifier) {
        notifier.addListener(runnerListener);
        runner.run(notifier);
    }

    @Override
    public Description getDescription() {
        return runner.getDescription();
    }

    public void filter(final Filter filter) throws NoTestsRemainException {
        runner.filter(filter);
    }
}

PS: を使用したくない場合はRunner、Markus の回答 ( TestRule、 NOTを使用TestRunner) に従うことができます。

于 2016-11-18T16:03:26.693 に答える