Запутанный порядок выполнения методов JUnit - PullRequest
3 голосов
/ 04 октября 2019

Я создал собственный бегун, расширив 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, это регистрирует 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");
    }
}

Опять вывод, помеченный в соответствии с порядком, который я ожидаю.

Вот вывод, который я получаю, когда язапустить MyTestSuite через IntelliJ (в качестве конфигурации запуска 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)

1 Ответ

1 голос
/ 04 октября 2019

Как подсказывает @DmitryB в комментариях, это похоже на некоторую форму буферизации вывода. После завершения теста различные части выходных данных странным образом соединяются.

Я добавляю Thread.sleep(1000) после каждой распечатки, и вот как это выглядит, когда я запускаю его в IntelliJ:image

The workaround for now is to use the gradle task run configuration rather than the JUnit one.

Filed этот билет на Jetbrains.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...