2013-02-17 68 views
0

所有我'尝试运行这样一个JUnit测试:的Class.forName异常

我有这些文件:

./tested/Resta.java
./tested/Suma。类
./tested/Suma.java
./tested/Resta.class
./test/TestResta.class
./test/TestSuma.java
./test/TestSuma.class
./测试/TestResta.java
./Spumevaluador.class
./Spumevaluador.java

当我运行Spumevaluador(java命令/home/minyatur/.netbeans/7.2/modules/ext/junit-4.10.jar :。 Spumevaluador)我得到这个错误:

minyatur @ orome:〜/ codigo $ ./ejecuta.sh HOLA 异常在线程 “主要” java.lang.NoClassDefFoundError:测试/ TestSuma(错误的名称:TestSuma) 在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) at java.net.URLClassLoader.access $ 100(URLClassLoader.java:71) at java.net.URLClassLoader $ 1.run(URLClassLoader.java:361) at java.net.URLClassLoader $ 1.run(URLClas sLoader.java:355) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423)java.security.AccessController.doPrivileged(Native Method) ) 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的调用没有找到test.TestSuma,如果我改变了Class.forname(“TestSuma”);并在类路径中包含../test,它工作正常。

为什么?有任何想法吗?

回答

1

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

package test; 

到TestSuma.java文件的顶部。

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

1

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

发现文件 - 但它加载的类是实际上称为TestSuma在默认包...所以它失败。

这不是真的清楚你在做什么试图来实现,但你应该保持在其中封装结构相匹配的结构类文件,只有尝试使用他们的正确完全限定类名来加载文件。

+0

对不起,这是一个愚蠢的错误。软件包测试未在TestSuma.java中定义。 – minyatur 2013-02-17 21:23:28

+0

@minyatur:查看TestSuma的*源代码*。它不会在包'test'中声明 - 但是* *要求*包含'test'包。因此,即使Java找到该文件,它也知道它*没有找到您要求的类。你必须让它们相配。包*不是*只是发现类的问题。 – 2013-02-17 21:24:38