Java 在Junit5中为每个测试设置环境变量
我必须将测试从JUnit4迁移到JUnit5,我有@Rule来设置环境变量。在JUnit4中,每个测试都清除了变量,在JUnit5中,我需要相同的行为,因为现在运行的测试是单独通过的,但当我从类中运行所有测试时,第二个测试失败,因为仍然有相同的环境变量 我有:Java 在Junit5中为每个测试设置环境变量,java,junit,Java,Junit,我必须将测试从JUnit4迁移到JUnit5,我有@Rule来设置环境变量。在JUnit4中,每个测试都清除了变量,在JUnit5中,我需要相同的行为,因为现在运行的测试是单独通过的,但当我从类中运行所有测试时,第二个测试失败,因为仍然有相同的环境变量 我有: @Rule public final EnvironmentVariables environmentVariables = new EnvironmentVariables(); @Test void method1(){...}
@Rule
public final EnvironmentVariables environmentVariables = new EnvironmentVariables();
@Test
void method1(){...}
@Test
void method2(){...}
我还不熟悉Junit 5,因此提前感谢您的帮助我想您在关键字
final
方面有问题。移除它,它应该会工作
试着这样做:
@Rule
public EnvironmentVariables environmentVariables = new EnvironmentVariables();
final=定义只能指定一次的实体
所以从我的角度来看,这是在打乱你的跑步
希望这能有所帮助,您在JUnit4中使用的
@Rule
应该在JUnit5中提供一个非常接近的特性。因此,您可以创建一个扩展,例如执行
@Rule
逻辑的EnvironmentVariablesExtension
,并通过用(EnvironmentVariablesExtension.class)注释您的测试类@Extension来在单元测试中使用它
请注意,如果在单个单元测试类中使用单个@规则
,则可以将此逻辑移到每次运行测试之前调用的@beforeach
生命周期方法中。
如果在单个项目中只有少数几个类使用此设置
,您仍然可以在每个@beforeach
方法中引入一个抽象的基本测试类来执行此设置,并使您的单元测试类继承自此基本类。
@Rule
的最大价值之一是当您想要为单元测试定义多个规则时,或者当您想要在其他应用程序/项目中重用规则时。事实并非如此,在JUnit5中将它们作为Extension
引入,暂时保持简单,不要觉得有什么限制 上面的环境变量
规则看起来像系统规则-
这被系统Lambda所取代,该系统允许在测试主体内设置变量:
withEnvironmentVariable(“FOO”、“bar”)
.execute(()->{…测试代码});
但是,有一个名为System Stubs的新库,其中包含与OP代码等效的代码:
@ExtendWith(SystemStubsExtension.class)
类测试{
@系统存根
私有环境变量环境变量;
@试验
无效测试(){
环境变量集(“FOO”、“bar”);
//使用环境
//环境已于年底清拆
}
}
环境变量对象也可以在@beforeach
方法中初始化,或者显式构造为在测试类的初始值设定项列表中具有值。不幸的是,它没有帮助,我检查了一下,在第二次测试中,我仍然看到为第一次测试设置了变量。您找到了解决方案吗?问题是,EnvironmentVariables与实现SOIT的JUnit 4相关联。如果您在扩展或BeforeeTech中使用它,则永远不会执行apply方法。