gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:13:31 28 4
gpt4 key购买 nike

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

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

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

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

我还没有尝试过,但我知道我可以使用这些类(class)使用类的 String 名称进行反射,但这看起来像疯狂的过度杀戮。

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

最佳答案

将解决评论移至答案:

getClass()是所有 java Object 上都有的方法告诉你class其中Object 。自从你的sortClass Object 本身就是一个 Class Object ,调用 getClass()其结果是 Class 。相反,您可以简单地调用 sortClass.getName()将为您提供 sortClass 的名称本身。

<小时/>

TL;博士:

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

关于java - 使用 @ParameterizedTest 和 @MethodSource 或 @ValueSource 对多个类运行相同的 JUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59200858/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com