У меня есть подкласс 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. Решено.