我必须将测试从JUnit 4迁移到JUnit 5,我必须使用@Rule来设置EnvironmentVariables变量。在Junit 4中,为每个测试清除了变量,在JUnit 5中,我需要相同的行为,因为现在正在运行的测试是分别传递的,但是当我从类中运行所有测试时,第二个测试将失败,因为仍然具有相同的环境变量。 >
我有:
@Rule
public final EnvironmentVariables environmentVariables = new EnvironmentVariables();
@Test
void method1(){...}
@Test
void method2(){...}
我还不熟悉Junit 5,所以在此先感谢您的帮助
答案 0 :(得分:0)
我认为您在使用关键字final
时遇到了问题。删除它,它应该可以工作,
尝试这样:
@Rule
public EnvironmentVariables environmentVariables = new EnvironmentVariables();
final =定义一个只能分配一次的实体
所以从我的角度来看,这弄乱了您的奔跑。
希望这会有所帮助,
答案 1 :(得分:0)
在JUnit 4中对@Rule
所做的操作应该在Extension
中完成,该功能在JUnit 5中提供了非常紧密的功能。
因此,您可以创建一个扩展EnvironmentVariablesExtension
来执行@Rule
的逻辑,并通过注释测试类@ExtendWith(EnvironmentVariablesExtension.class)
在单元测试中使用它。
请注意,如果在单个单元测试类中使用单个@Rule
,则可以将此逻辑移入@BeforeEach
lifecyle方法中,该方法在每次运行测试之前都会被调用。
如果只有几个类在单个项目中使用此setup
,则仍可以引入一个抽象的基础测试类,该抽象基础测试类使用@BeforeEach
方法进行此设置,并使您的单元测试类继承自该基础课。
@Rule
的最大价值之一是当您要为单元测试定义多个规则时,或者要在其他应用程序/项目中重用规则时。并非如此,在JUnit5中将它们作为Extension
引入并暂时保持简单不会感到束缚。
答案 2 :(得分:0)
上面的EnvironmentVariables
规则类似于系统规则-https://github.com/stefanbirkner/system-rules
这已被System Lambda-https://github.com/stefanbirkner/system-lambda取代,后者允许在测试主体内设置变量:
withEnvironmentVariable("FOO", "bar")
.execute(() -> { ... test code } );
但是,有一个名为System Stubs的新库-https://github.com/webcompere/system-stubs,其中包含与OP的代码等效的代码:
@ExtendWith(SystemStubsExtension.class)
class SomeTest {
@SystemStub
private EnvironmentVariables environmentVariables;
@Test
void someTest() {
environmentVariables.set("FOO", "bar");
// use environment
// environment cleared at end
}
}
环境变量对象也可以在@BeforeEach
方法中初始化,也可以显式构造为在测试类的初始化列表中具有值。