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

时间:2018-07-09 08:05:23

标签: java junit

我必须将测试从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,所以在此先感谢您的帮助

3 个答案:

答案 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方法中初始化,也可以显式构造为在测试类的初始化列表中具有值。