单元测试中的异常

问题描述

我复制了一本书中的单元测试。完全相同的。编译器没有问题,但运行时有一些例外。我的代码有问题吗?如果不是,是什么原因,解决办法是什么?

这是我的课:

package Testing;

public class MessageUtil {

    private String message;

    public MessageUtil(String message) {
        this.message = message;
    }

    public String printMessage() {
        System.out.println(message);
        return message;
    }
    public static void main(String[] args) {
        
    }
}

这是测试用例:

package Testing;

import org.junit.Test;

import junit.framework.TestCase;

public class TestJunit extends TestCase {
    String message = "Hello World";
    MessageUtil messageUtil = new MessageUtil(message);

    @Test
    public void testPrintMessage() {
        assertEquals(message,messageUtil.printMessage());
    }
}

这是测试运行器:

package Testing;

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {

    public static void main(String[] args) {
        
        Result result = JUnitCore.runclasses(TestJunit.class);
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }
        System.out.println(result.wasSuccessful());
    }
}

这是打印的异常:

Exception in thread "main" java.lang.NoClassDefFoundError: junit/framework/TestCase
at java.base/java.lang.classLoader.defineClass1(Native Method)
at java.base/java.lang.classLoader.defineClass(ClassLoader.java:1016)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:825)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClasspathOrNull(BuiltinClassLoader.java:723)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:646)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:604)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522)
at Testing.TestRunner.main(TestRunner.java:11)
Caused by: java.lang.classNotFoundException: junit.framework.TestCase
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
    at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522)
    ... 10 more

解决方法

看起来您正在使用一本过时的书来学习 JUnit。我最初的建议是购买一个更新的,涵盖最新版本的 JUnit,或者直接在 JUnit 网站上查找文档:https://junit.org/junit5/

回答您的问题,当 Java 虚拟机 (JVM) 尝试加载类并且在类路径中找不到指定的类时,会抛出 java.lang.ClassNotFoundException。在您的情况下,JVM 未找到 junit.framework.TestCase 类型,因此它无法编译/运行您的 Java 程序。

您可以通过将 JUnit Jar 添加到类路径来解决此问题。查看此页面以了解如何执行此操作:https://examples.javacodegeeks.com/how-to-set-classpath-in-java/

Ps:您没有提到您使用的是哪个 IDE,因此我建议您首先查看安装了 Java 扩展包的 VisualStudioCode,如下所示:https://junit.org/junit5/docs/current/user-guide/#running-tests-ide-vscode