我有一个程序,我想从一个类中获取方法,并验证它们是否有@Test注解,如果有,则输出方法的名称。问题是当我调用getAnnotation(Test.class)时,它在java ClassLoader和BuiltinClassLoader中找不到Test类,并抛出ClassNotFoundException。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.annotation.Annotation;
import org.junit.jupiter.api.Test;
public class Lab12 {
public static void main(String[] args) {
if(args.length < 1) {
System.err.println("Input: <class name>");
}
try {
Class testedClass = Class.forName(args[0].toString());
Package testedPackage = testedClass.getPackage();
System.out.println("Name of the class: " + testedClass.getName());
System.out.println("Name of the package: " + testedPackage.getName());
Method[] classMethods = testedClass.getDeclaredMethods();
for(Method method : classMethods) {
System.out.println("So far good");
if(method.getAnnotation(Test.class) != null) {
if(method.getParameterCount() == 0) {
method.setAccessible(true);
method.invoke(null);
System.out.println("Test method invoked: " + method.getName());
}
}
}
}
catch(ClassNotFoundException ex) {
System.err.println(ex);
}
catch(IllegalAccessException ex) {
System.err.println(ex);
}
catch(InvocationTargetException ex) {
System.err.println(ex);
}
}
}
我收到的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/junit/jupiter/api/Test
at Lab12.main(Lab12.java:20)
Caused by: java.lang.ClassNotFoundException: org.junit.jupiter.api.Test
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more
我已经在pom.xml中实现了JUnit API的依赖项,并且它们在程序中被识别。
如果我改变getAnnotation的参数(例如Override.class),它就能工作。我已经在程序中导入了org.junit.jupiter.API.Test。
1条答案
按热度按时间bvjxkvbb1#
而不是以以下方式运行程序:
试着像这样运行它:
<path_to_junit_jar>
-应该是junit.jar的完整路径。这需要给出,以便JVM在运行时也知道该jar文件的位置。pom.xml
在运行程序时不会被使用。它只会在运行mvn build
等时使用。maven命令。因此,在运行时,您的命令根本找不到JUnit。还要注意的是,当你通过类的反射运行测试方法时--例如
method.invoke(null)
-如果您的测试类有进一步的依赖关系-例如mockito或DB jar(例如mysql连接器/j)或其他任何东西-那么这些也需要添加到类路径jar的-cp
列表中。