JUnit 5,如何从BeforeEach回调中获取参数化测试参数?

时间:2019-02-14 10:06:21

标签: java junit junit5

我在不同的类中有以下几种方法:

@ParameterizedTest
@MethodSource("com.myapp.AppleProvider#getApplesDependingOnConditions")
public void testSomething(Apple apple) {
   SomeContainer.getInstance().setApple(apple)
   // ...
}

问题是我无法避免以下内容的复制/重复

    每个测试调用的
  • name自变量
  • 每个测试的第一行-SomeContainer.getInstance().setApple(apple)

我尝试使用扩展点-BeforeTestExecutionCallbackBeforeEachCallback,但是它们似乎没有能力获取被调用的参数。

根据https://github.com/junit-team/junit5/issues/1139https://github.com/junit-team/junit5/issues/944,无法访问从扩展点传递给测试的参数,并且参数化测试不适用于BeforeEach回调。

所以我基本上是在寻找任何解决方法,以便我的测试看起来像这样:

@MyAwesomeTest
public void testSomething() {
   // ... 
}

@MyAwesomeTest在上面封装了两个注释。

我已经找到的东西:

  • 在扩展点上,可以使用以下数据:displaynamemethodtags。如果我将参数传递给每个测试方法(尽管这是非常不希望的),则我可以依靠displayname,因为它将反映传递给方法调用的参数的特定参数。 我试图找出是否还有其他方法无需在每个方法中添加参数。

1 个答案:

答案 0 :(得分:1)

我认为您可以通过欺骗获得大部分途径:

public static Stream<String> apples() {
  return com.myapp.AppleProvider
    .getApplesDependingOnConditions()
    .stream()
    .peek(apple -> SomeContainer.getInstance().setApple(apple))
    .map(apple -> { /* convert to name string */ })
}

@ParameterizedTest
@MethodSource("apples")
public void testSomething(String name) {
   // ...
}