我有一个子类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的假设下编写的。已解决。
在junit4中,此注释称为java_test
,应在@BeforeClass
方法上。它在执行该类中的所有测试方法之前执行。 Junit5注释将在junit4中忽略]
对于每次执行方法,Junit都会创建static
的新实例,因此您不能在AnswerQuestionTests
中使用实例字段。
一种选择是将初始化的客户端存储在静态字段中。