java - 在 JUnit Test 子类中引用 protected 变量时获取 NullPointerException

标签 java unit-testing junit junit4 bazel

我有一个子类 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() 方法中初始化,该方法是使用 @BeforeAllAnswerQuestionTests 调用的注释:

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/

相关文章:

java - 为什么我用 Eclipse 制作的 Java 小程序无法运行?

iphone - Xcode 4 使用命令行进行单元测试

java - 尝试运行junit测试并收到以下错误: unreported exception Overflow; must be caught or declared to be thrown

java - 如何在动态创建的 TestCase 上运行 PowerMock

c++ - 如何使模拟对象在 Google Mock 中引发异常?

java - 如何在构造函数内模拟实例?

java - 如何在游戏循环中的图形上下文中绘制?

java - 使用 lambda 从 2 个现有对象创建新对象,总结 ArrayList 字段中各种对象的各种值

java - GUI 卡布局 - 操作监听器不工作

c# - 有没有更好的方法用最小起订量编写这个测试?