我正在创建一个排序算法库。每个类都有相同的方法:
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中最好的方法吗?
答案 0 :(得分:1)
将解决评论移至答案:
getClass()
是所有Java Object
上附带的一种方法,用于告诉您class
中的Object
。由于您的sortClass
Object
本身就是一个Class
Object
,因此对其调用getClass()
会得到Class
。相反,您可以简单地调用sortClass.getName()
,它会为您提供sortClass
本身的名称。
TL; DR:
将sortClass.getClass().getName()
替换为sortClass.getName()
。 :)