我有一个子类 AnswerQuestionTests
,其中包含几个用 @Test
注释的 JUnit 测试(我正在运行 JUnit 4)。这个子类扩展了一个父类(super class)TestBase
,它没有其他测试方法,但包含一堆protected
变量。我们的想法是,为了减少代码重复,我们将让所有测试扩展 TestBase
以避免重复大多数测试所需的一些模拟服务的初始化代码。
例如,我在 AnswerQuestionTests
中有一个方法,用于测试数据库中徽章的进度是否递增:
@Test
public void testBadgeProgressIncremented() {
int badgeProgressBeforeAction = clientModule.badgeClient().getCurrentBadgeActivity();
...
}
在本例中,clientModule
是一个protected
变量,在父类(super class)TestBase
中声明。该变量在 TestBase
中的 initialize()
方法中初始化,该方法是使用 @BeforeAll
从 AnswerQuestionTests
调用的注释:
public class AnswerQuestionTests extends TestBase {
@BeforeAll
public void initialize() {
super.initialize();
}
...
}
我使用 Bazel 的 java_test
运行此测试规则,它采用 test_class
作为参数,我给它提供 AnswerQuestionTest
类。但是,运行程序会在引用 clientModule
以及父类(super class)中声明的所有其他 protected
变量时产生一个 NullPointerException
。
我认为这与我缺乏对 JUnit 运行程序如何工作的了解有关,但有人可以提供任何建议吗?
编辑:我还使用 @TestInstance(Lifecycle.PER_CLASS)
注释 AnswerQuestionTests
,以便 JUnit 运行程序仅为每个类创建一次新实例,而不是为每个方法创建一次。
编辑 2:问题是 Bazel java_test
运行程序 native 运行 JUnit4,但我们所有的测试之前都是在使用 JUnit5 的假设下编写的。已解决。
最佳答案
在 junit4 中,此注释称为 @BeforeClass
并且应该位于 static
方法上。它在执行此类中的所有测试方法之前执行。 Junit5注释在junit4中将被忽略
对于每个方法执行,Junit 都会创建一个 AnswerQuestionTests
的新实例,因此您不能在 @BeforeClass
中使用实例字段。
一种选择是将初始化的客户端存储在静态字段中。
关于java - 在 JUnit Test 子类中引用 protected 变量时获取 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61050823/