说我有一个@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()
调用中进行设置。
答案 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()
}