Class.forname例外

时间:2013-02-17 21:16:36

标签: java junit classpath

所有我都试图以这种方式进行junit测试:

我有这些文件:

./ tested / Resta.java
./tested/Suma.class
./tested/Suma.java
./tested/Resta.class
./test/TestResta.class
./test/TestSuma.java
./test/TestSuma.class
./test/TestResta.java
./Spumevaluador.class
./Spumevaluador.java

当我运行Spumevaluador(java -cp /home/minyatur/.netbeans/7.2/modules/ext/junit-4.10.jar:.Spumevaluador)时出现此错误:

minyatur @ orome:〜/ codigo $ ./ejecuta.sh 你好 线程“main”中的异常java.lang.NoClassDefFoundError:test / TestSuma(错误名称:TestSuma)     at java.lang.ClassLoader.defineClass1(Native Method)     at java.lang.ClassLoader.defineClass(ClassLoader.java:787)     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)     at java.net.URLClassLoader.defineClass(URLClassLoader.java:447)     在java.net.URLClassLoader.access $ 100(URLClassLoader.java:71)     在java.net.URLClassLoader $ 1.run(URLClassLoader.java:361)     在java.net.URLClassLoader $ 1.run(URLClassLoader.java:355)     at java.security.AccessController.doPrivileged(Native Method)     在java.net.URLClassLoader.findClass(URLClassLoader.java:354)     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)     at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)     at java.lang.Class.forName0(Native Method)     at java.lang.Class.forName(Class.java:188)     在Spumevaluador.main(Spumevaluador.java:45)

Spumevaluador.java代码:

import org.junit.runner.JUnitCore;
import java.util.Iterator;
import org.junit.internal.TextListener;
import org.junit.runner.Computer;
import org.junit.runner.Request;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import java.util.ArrayList;

public class Spumevaluador {

    public static void main(String[] args) throws ClassNotFoundException {

    System.out.println("Hola");
        ArrayList clases = new ArrayList();
        clases.add("test.TestSuma");
        clases.add("test.TestResta");        
        Class<?>[] cClases = new Class<?>[clases.size()];
        for (int i = 0; i < clases.size(); i++) {
            cClases[i] = Class.forName(clases.get(i).toString());
        }
        Request req = Request.classes(cClases);
        JUnitCore jUnitCore = new JUnitCore();
        jUnitCore.addListener(new TextListener(System.out));
        jUnitCore.run(req);
    }
}

如果我改变Class.forname(“TestSuma”),似乎对Class.forname的调用没有找到test.TestSuma;并在classpath中包含../test它工作正常。

为什么呢?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

基本上,当您运行Class.forName("test.TestSuma")时,它会尝试在名为TestSuma的程序包中加载名为test的类。它正在名为TestSuma.class的目录中名为test的类文件中查找。

找到文件 - 但它加载的类在默认包中实际上 名为TestSuma ...所以它失败了。

您正在尝试实现什么并不是很清楚,但您应该将类​​文件保留在与包结构匹配的结构中,并且只尝试使用正确的文件加载文件完全合格的班级名称。

答案 1 :(得分:2)

听起来您的TestSuma类是在默认包而不是测试包中定义的。尝试添加:

package test;

到TestSuma.java文件的顶部。

Java类路径包含Java可以找到包层次结构根的位置。如果测试包中有一个类,则需要将包含“test”子目录的目录放在类路径中,而不是放在test子目录本身。