Получение исключения NullPointerException со ссылкой на защищенную переменную в подклассе JUnit Test - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть подкласс AnswerQuestionTests, который содержит несколько тестов JUnit с пометкой @Test (я использую JUnit 4). Этот подкласс расширяет суперкласс TestBase, который не имеет других методов тестирования, но содержит набор переменных protected. Мы поняли, что для уменьшения дублирования кода все наши тесты будут расширены на TestBase, чтобы избежать дублирования кода для инициализации некоторых поддельных сервисов, в которых нуждается большинство наших тестов.

Например, У меня есть метод в AnswerQuestionTests, который проверяет, увеличивается ли прогресс значка в базе данных:

@Test
public void testBadgeProgressIncremented() {
    int badgeProgressBeforeAction = clientModule.badgeClient().getCurrentBadgeActivity();
    ...
}

В этом случае clientModule является переменной protected, которая объявлена ​​в суперкласс TestBase. Эта переменная инициализируется в методе initialize() в TestBase, который вызывается из AnswerQuestionTests с использованием аннотации @BeforeAll:

public class AnswerQuestionTests extends TestBase {
    @BeforeAll
    public void initialize() {
        super.initialize();
    }
    ...
}

Я запускаю этот тест, используя java_test Базеля Правило , которое принимает test_class в качестве параметра, и я даю ему класс AnswerQuestionTest. Тем не менее, бегун выдает NullPointerException со ссылкой на clientModule и все другие protected переменные, объявленные в суперклассе.

Полагаю, это как-то связано с отсутствием у меня знаний о том, как работает бегун JUnit, но кто-нибудь может дать какой-нибудь совет?

РЕДАКТИРОВАТЬ: Я также комментирую AnswerQuestionTests с помощью @TestInstance(Lifecycle.PER_CLASS) так что бегун JUnit создает новый экземпляр только один раз для класса, а не один раз для метода.

РЕДАКТИРОВАТЬ 2: Проблема заключалась в том, что бегун Bazel java_test изначально запускает JUnit4, но все наши тесты были ранее написаны при условии использования JUnit5. Решено.

1 Ответ

1 голос
/ 06 апреля 2020

В junit4 эта аннотация называется @BeforeClass и должна иметь метод static. Он выполняется до того, как будут выполнены все тестовые методы в этом классе. Аннотация Junit5 будет игнорироваться в junit4

. Для каждого выполнения метода Junit создает новый экземпляр AnswerQuestionTests, поэтому вы не можете использовать поля экземпляра в @BeforeClass.

Один из вариантов - сохранить инициализированный клиент в поле c.

...