问题描述
我复制了一本书中的单元测试。完全相同的。编译器没有问题,但运行时有一些例外。我的代码有问题吗?如果不是,是什么原因,解决办法是什么?
这是我的课:
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。