将参数从 JUnit 5 @BeforeEach 传递给单独的测试

Pass parameter from JUnit 5 @BeforeEach to individual test

假设我有一个 @BeforeEach 方法,它使用外部方法获取值并使用所述值设置一些东西:

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

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

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

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

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

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

然后

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

应该可以

没有特定于 junit 的工具来支持您的想法。

除非您使用 @TestInstance(Lifecycle.PER_CLASS),否则将为每个测试调用创建新的测试实例 class。这意味着,@Bill K 是对的,欢迎您初始化测试 class 字段。

但更好的方法是在 given 部分的某处使用 parametrized test with @MethodSource 并在测试中执行 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()
}