运行 使用@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
上的方法,用于告诉您 Object
的 class
。由于您的 sortClass
Object
本身是 一个 Class
Object
,因此调用 getClass()
会导致 Class
.相反,您可以简单地调用 sortClass.getName()
, 将 为您提供 sortClass
本身的名称。
长话短说:
将 sortClass.getClass().getName()
替换为 sortClass.getName()
。 :)
我正在创建一个排序算法库。每个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
上的方法,用于告诉您 Object
的 class
。由于您的 sortClass
Object
本身是 一个 Class
Object
,因此调用 getClass()
会导致 Class
.相反,您可以简单地调用 sortClass.getName()
, 将 为您提供 sortClass
本身的名称。
长话短说:
将 sortClass.getClass().getName()
替换为 sortClass.getName()
。 :)