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()
}