Java 将参数从JUnit 5@beforeach传递到单个测试
假设我有一个Java 将参数从JUnit 5@beforeach传递到单个测试,java,junit,junit5,Java,Junit,Junit5,假设我有一个@beforeach方法,它使用一个外部方法来获取一个值,并使用所述值设置一些内容: @beforeach void foo(){ int bar=getBarFromSomething(); 用bar设置something(bar); } 现在,我希望能够在测试用例之前调用foo()方法之后,将bar的值(每次调用getBarFromSomething()时可能会更改)传递给每个单独的测试用例。我想这样做,以便可以使用我在每个foo()方法调用之前在@beforeach中设置的参
@beforeach
方法,它使用一个外部方法来获取一个值,并使用所述值设置一些内容:
@beforeach
void foo(){
int bar=getBarFromSomething();
用bar设置something(bar);
}
现在,我希望能够在测试用例之前调用foo()
方法之后,将bar
的值(每次调用getBarFromSomething()
时可能会更改)传递给每个单独的测试用例。我想这样做,以便可以使用我在每个foo()方法调用之前在@beforeach中设置的参数测试某些内容:
@测试
无效测试_baz(内部条形图){
资产质量(巴,5);
}
如何将@beforeach foo()
调用中的参数传递给每个@Test
案例?我认为参数化测试不起作用,因为生成bar
的方法可能会输出不同的结果,因此在每次和@Test
案例运行之前,每个@只需调用一次,并且需要使用它在foo()中设置一些内容
调用。只需将方法变量移动到成员变量。。。像这样:
int bar = getBarFromSomething();
@BeforeEach
void foo() {
setupSomethingWithBar(bar);
}
然后
应该有效没有junit特定的工具来支持您的想法
除非使用@TestInstance(Lifecycle.PER_类),否则将为每个测试调用创建测试类的新实例。这意味着,@Bill K是对的,欢迎您初始化测试类字段
但是更好的方法是在给定部分的某个测试中使用并执行设置。这正是@ParameterizedTests要解决的任务
@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()
}
我可以在每次调用之前在@内调用getBarFromSomething()
时执行此操作,因为我需要在每个测试用例中调用它一次,但我不确定是否有更好的“JUnit实践”在不必触及测试类状态的情况下执行此操作,我需要在@beforeach
设置方法和测试本身中使用相同的条输出。因此,在您的示例中,假设bar
方法返回一个随机条,我必须在每次调用之前调用bar()
以在@中获得一个随机条,然后我必须以某种方式将相同的条传递到is5
,因为如果我再次调用bar
,我将得到一个不同的条。这就是为什么据我所知我不能使用参数化测试的原因。我的想法不是将@beforeach用于特定于测试的设置(它旨在进行一般准备),而是直接在测试主体中执行特定于测试的设置。啊,我明白你的意思。我当然可以这样做,但考虑到@beforeach
方法是测试之间的公共设置,这似乎很不方便,但在这种情况下,我不能使用它。
@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()
}