JUnitのメソッドの混乱実行順序

aioobe:

私は拡張してカスタムランナーを作成しましたSuite

public class MyRunner extends Suite {

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

    @Override
    public void run(RunNotifier notifier) {
        notifier.addListener(new MyRunListener());
        notifier.fireTestRunStarted(getDescription());
        super.run(notifier);
    }
}

見られるようにrun、このregisteres MyRunListener次のようになりた:

class MyRunListener extends RunListener {
    @Override
    public void testRunStarted(Description description) {
        System.err.println("1: run started");
    }

    @Override
    public void testStarted(Description description) {
        System.err.println("2: test started");
    }

    @Override
    public void testFinished(Description description) {
        System.err.println("3: test finished");
    }

    @Override
    public void testRunFinished(Result result) {
        System.err.println("4: run finished");
    }
}

私が追加した1:2:3:4:私は、これらのメソッドが呼び出されることを期待した順序に従って。

ルックスは、次のようにすることを、私は、テストスイートを作成しました:

@RunWith(MyRunner.class)
@Suite.SuiteClasses({ MyTest.class })
public class MyTestSuite {
}

そして、次のテスト:

public class MyTest {
    @BeforeClass
    public static void beforeClass() {
        System.err.println("A: beforeClass");
    }

    @Before
    public void before() {
        System.err.println("B: before");
    }

    @Test
    public void test() {
        System.err.println("C: Running actual test...");
    }

    @After
    public void after() {
        System.err.println("D: after");
    }

    @AfterClass
    public static void afterClass() {
        System.err.println("E: afterClass");
    }
}

ここでも、出力は私が期待する順序に従ってラベルされました。

ここで私が実行したときに私が手出力ですMyTestSuiteIntelliJの通過(JUnitの実行構成としては):

2: test started

B: before
C: Running actual test...
D: after

3: test finished
E: afterClass

4: run finished
1: run started
A: beforeClass

なぜ地球上で私は、その出力順序を取得していますか?私はランナーでは非常に間違って何かをする必要がありますが、私は、ウェブ上のチュートリアルに従って、それを実装しました。(JUnitの4.12を使用して)

aioobe:

@DmitryBはコメントで示唆したように、出力バッファリングのいくつかのフォームのようです。出力の様々な部分は、テストが終了した後に奇妙な方法で一緒にステッチされます。

私は、追加Thread.sleep(1000)の各プリントアウトした後、これは私がのIntelliJでそれを実行すると、それがどのように見えるかです:

今の問題を回避するには、JUnitの1のではなく、Gradleのタスクの実行構成を使用することです。

提出されたこのチケットをジェットブレーンズで。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=330966&siteId=1