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

Running the same JUnit tests for multiple classes using @ParameterizedTest with either @MethodSource or @ValueSource

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

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

我会让 classes 都实现一个接口或扩展一个 abstract class 但 sort 方法是 static 这意味着它不能 被覆盖。

这是我第一次使用 JUnit 5。我想 运行 同样 JUnit 测试所有类型 classes。经过一些研究,似乎 在 JUnit 5 中执行此操作的方法是使用 @ParameterizedTest。我的方式 正在考虑的是将 class 作为测试方法中的参数, 使用反射获取 sort 方法,并调用它。问题是,我 似乎在将 classes 传递给测试时遇到了问题。当我 将 @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

我还没有尝试过,但我知道我可以使用 classes 用 classes 的 String 名称进行反射,但这看起来像 疯狂矫枉过正。

我错过了什么?这是 JUnit 5 中的最佳方法吗?

将解决问题的评论移至答案:

getClass() 是一种出现在所有 java Object 上的方法,用于告诉您 Objectclass。由于您的 sortClass Object 本身是 一个 Class Object,因此调用 getClass() 会导致 Class.相反,您可以简单地调用 sortClass.getName() 为您提供 sortClass 本身的名称。


长话短说:

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