将参数从 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()
}
假设我有一个 @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()
}