获取有关JUnit Test子类中受保护变量的NullPointerException

问题描述 投票:0回答:1

我有一个子类AnswerQuestionTests,其中包含几个用@Test注释的JUnit测试(我正在运行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();
    }
    ...
}

我使用Bazel的java_test规则运行此测试,该规则将java_test作为参数,并将其赋予test_class类。但是,运行程序会参考AnswerQuestionTest和超类中声明的所有其他NullPointerException变量生成一个clientModule

我认为这与我对JUnit运行器的工作原理缺乏了解有关,但是有人可以提供任何建议吗?

编辑:我也用protected注释了AnswerQuestionTests,以便JUnit运行器每个类仅创建一个新实例,而不是每个方法一次。

编辑2:问题是Bazel @TestInstance(Lifecycle.PER_CLASS)运行程序本机运行JUnit4,但是我们所有的测试以前都是在使用JUnit5的假设下编写的。已解决。

java unit-testing junit junit4 bazel
1个回答
1
投票

在junit4中,此注释称为java_test,应在@BeforeClass方法上。它在执行该类中的所有测试方法之前执行。 Junit5注释将在junit4中忽略]

对于每次执行方法,Junit都会创建static的新实例,因此您不能在AnswerQuestionTests中使用实例字段。

一种选择是将初始化的客户端存储在静态字段中。

© www.soinside.com 2019 - 2024. All rights reserved.