将参数从JUnit 5 @BeforeEach传递到单个测试

时间:2019-09-20 21:59:48

标签: java junit junit5

说我有一个@BeforeEach方法,该方法使用外部方法来获取值并使用该值进行设置:

@BeforeEach
void foo() {
  int bar = getBarFromSomething();
  setupSomethingWithBar(bar);
}

现在,我希望能够在调用bar方法之后,将getBarFromSomething()的值(每次调用foo()时可能会改变)传递给每个测试用例。测试用例。我想这样做,以便可以使用在@BeforeEach foo()方法调用中设置的参数来测试某些东西:

@Test
void test_baz(int bar) {
  assertEquals(bar, 5);
}

我该如何将参数从@BeforeEach foo()调用传递到每个单独的@Test案例?我不认为参数化测试会起作用,因为生成bar的方法可能会输出不同的结果,因此每次@BeforeEach@Test用例运行只需调用一次,并且它需要用于在foo()调用中进行设置。

2 个答案:

答案 0 :(得分:5)

只需将方法变量移动到成员变量...就像这样:

int bar = getBarFromSomething();
@BeforeEach
void foo() {
    setupSomethingWithBar(bar);
}

然后

@Test
void test_baz() {
    assertEquals(bar, 5);
}

应该工作

答案 1 :(得分:1)

没有特定于junit的工具可以实现您的想法。

除非使用 @TestInstance(Lifecycle.PER_CLASS),否则将为每个测试调用创建测试类的新实例。也就是说,@ Bill K是正确的,欢迎您初始化测试类字段。

但是更好的方法是将parametrized test@MethodSource结合使用,并在 give 部分中的测试中直接执行 setup 。这正是@ParametrizedTests要解决的任务。

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class TestSample {

   @ParameterizedTest
   @MethodSource("bars")
   fun isFive(bar:Int){
       setupSomethingWithBar(bar)  
       assertEquals(bar, 5)
   }

   fun bars() = (1..10).asSequence().asStream()
}