Почему JUnit дважды запускает тесты с разными результатами?

При запуске JUnit из Eclipse (используя правый клик | запустить как - те же результаты на уровне проекта и на уровне отдельных тестов) мои тесты запускаются дважды. Один раз тесты выполняются как положено (и помечены только именем пакета), в другой раз я получаю ложные исключения нулевого указателя (и помечен полным именем пакета). У меня нет никаких наборов, и разные результаты на трассах означают, что это не та же проблема, что и у других, когда тесты запускаются дважды.

Мой тестовый файл (без импорта):

public class CommandHistoryTest extends TestCase {
    private CommandHistory commandHistory;

    @BeforeEach
    public void initEach() {
        commandHistory = new CommandHistory();
    }

    @Test
    @DisplayName("On creation, canUndo and canRedo should be false")
    public void testCreate() {
        Assertions.assertFalse(commandHistory.canUndo());
        Assertions.assertFalse(commandHistory.canRedo());
    }
}

Как я уже сказал, это прекрасно работает на одном из проходов JUnit - он не работал, пока я не реализовал соответствующие биты commandHistory и прошло, когда я реализовал их - но с другой стороны это дает мне исключение нулевого указателя на Assertions.assertFalse(commandHistory.canUndo());

Я могу с этим смириться, потому что я получаю действительный набор результатов испытаний, но вид всех этих красных флажков на втором проходе меня огорчает. Как мне остановить ложные тесты?

РЕДАКТИРОВАТЬ: я отмечаю, что в проводнике пакетов тест отображается как "> CommandHistoryTest.java". Я добавил еще один тестовый класс, который не показывает символ ">" в ​​проводнике пакетов и который не запускается дважды. Что означает ">"?

ВНОВЬ РЕДАКТИРОВАТЬ: Нет, теперь я вижу, что '>' было частью интеграции git, но ответ ниже.

1 ответ

Решение

JUnit запускает ваш тест дважды: один раз с движком Vintage, потому что он расширяет TestCase из JUnit 3 и один раз с движком Jupiter, потому что он содержит метод, аннотированный org.junit.jupiter.api.Test, В то время как последний выполняет @BeforeEach Метод, первый не делает. Просто удали extends TestCase и он будет работать только один раз.

Другие вопросы по тегам