使用带有@MethodSource或@ValueSource的@ParameterizedTest对多个类运行相同的JUnit测试

时间:2019-12-05 17:59:58

标签: java generics junit reflection junit5

我正在创建一个排序算法库。每个类都有相同的方法:

public static <T extends Comparable<? super T>> void sort(T[] array)

我会让所有类都实现一个接口或扩展一个 抽象类,但是sort方法是static,这意味着它不能 被覆盖。

这是我第一次使用JUnit5。我想运行相同的命令 JUnit在所有排序类上进行测试。经过研究,似乎 在JUnit 5中执行此操作的方法是使用@ParameterizedTest。我的方式 当时考虑的是在测试方法中将类作为参数, 使用反射获取sort方法,然后调用它。问题是,我 似乎在将类传递给测试时遇到问题。当我 与@ParameterizedTest一起使用@ValueSource@MethodSource,参数中的Class类型 java.lang.Class

仅为了测试@ParameterizedTest的使用,我尝试了以下操作:

@ParameterizedTest
@MethodSource("sortClasses")
public void simpleParameterizedTest(Class<?> sortClass) {
   System.out.println(sortClass.getClass().getName());
}

private static Class<?>[] sortClasses() {
    return new Class<?>[] {
        BubbleSort.class
    };
}

@ParameterizedTest
@ValueSource(classes = {BubbleSort.class})
public void simpleParameterizedTest(Class<?> sortClass) {
    System.out.println(sortClass.getClass().getName());
}

两个打印:java.lang.Class而不是my.package.BubbleSort

我还没有尝试过,但是我知道我可以使用 用类的String反射,但这看起来像 野蛮的杀伤力。

我想念什么?这是JUnit 5中最好的方法吗?

1 个答案:

答案 0 :(得分:1)

将解决评论移至答案:

getClass()是所有Java Object上附带的一种方法,用于告诉您class中的Object。由于您的sortClass Object 本身就是一个Class Object,因此对其调用getClass()会得到Class。相反,您可以简单地调用sortClass.getName(),它会为您提供sortClass本身的名称。


TL; DR:

sortClass.getClass().getName()替换为sortClass.getName()。 :)