Java 在Junit5中为每个测试设置环境变量

Java 在Junit5中为每个测试设置环境变量,java,junit,Java,Junit,我必须将测试从JUnit4迁移到JUnit5,我有@Rule来设置环境变量。在JUnit4中,每个测试都清除了变量,在JUnit5中,我需要相同的行为,因为现在运行的测试是单独通过的,但当我从类中运行所有测试时,第二个测试失败,因为仍然有相同的环境变量 我有: @Rule public final EnvironmentVariables environmentVariables = new EnvironmentVariables(); @Test void method1(){...}

我必须将测试从JUnit4迁移到JUnit5,我有@Rule来设置环境变量。在JUnit4中,每个测试都清除了变量,在JUnit5中,我需要相同的行为,因为现在运行的测试是单独通过的,但当我从类中运行所有测试时,第二个测试失败,因为仍然有相同的环境变量

我有:

@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方法。