0

この方法で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 Hola Exception in thread "main" java.lang.NoClassDefFoundError: test/TestSuma (間違った名前: TestSuma) at java.lang.ClassLoader.defineClass1(Native Method) at java. lang.ClassLoader.defineClass(ClassLoader.java:787) で java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) で 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) で java.security.AccessController.doPrivileged(Nativeメソッド) で java.net.URLClassLoader.findClass(URLClassLoader.java:354) で java.lang.ClassLoader.loadClass(ClassLoader.java:423) で sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) で java.lang.ClassLoader.loadClass(ClassLoader.java:356) で java.lang.Class.forName0(Native Method) で 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 を見つけられないようです。../test をクラスパスに含めると、正常に動作します。

なんで?何か案は?

4

2 に答える 2

2

基本的に、実行すると、というパッケージで呼び出されるClass.forName("test.TestSuma")クラスをロードしようとしています。というディレクトリにあるクラスファイルでそれを探しています。TestSumatestTestSuma.classtest

ファイルを見つけますが、ロードするクラスは実際TestSumaにはデフォルトのパッケージで呼び出されるため、失敗します。

何を達成しようとしているのかは明確ではありませんが、パッケージ構造と一致する構造にクラス ファイルを保持し、適切な完全修飾クラス名を使用してファイルをロードするようにしてください。

于 2013-02-17T21:20:21.137 に答える
2

TestSuma クラスは、テスト パッケージではなくデフォルト パッケージで定義されているようです。追加してみてください:

package test;

TestSuma.java ファイルの先頭に追加します。

Java クラスパスには、Java がパッケージ階層のルートを見つけることができる場所が含まれています。テスト パッケージにクラスがある場合は、テスト サブディレクトリ自体ではなく、「テスト」サブディレクトリを含むディレクトリをクラスパスに配置する必要があります。

于 2013-02-17T21:25:41.213 に答える