如何修复在Java程序中使用getAnnotation(Test.class)和JUnit时的ClassNotFoundException?

wsewodh2  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(115)

我有一个程序,我想从一个类中获取方法,并验证它们是否有@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。

bvjxkvbb

bvjxkvbb1#

而不是以以下方式运行程序:

java Lab12 className

试着像这样运行它:

java -cp .;<path_to_junit_jar> Lab12 <className>

<path_to_junit_jar>-应该是junit.jar的完整路径。这需要给出,以便JVM在运行时也知道该jar文件的位置。pom.xml在运行程序时不会被使用。它只会在运行mvn build等时使用。maven命令。因此,在运行时,您的命令根本找不到JUnit。
还要注意的是,当你通过类的反射运行测试方法时--例如method.invoke(null)-如果您的测试类有进一步的依赖关系-例如mockito或DB jar(例如mysql连接器/j)或其他任何东西-那么这些也需要添加到类路径jar的-cp列表中。

相关问题