2013-02-17 5 views
0

все I'am пытается запустить 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 -cp /home/minyatur/.netbeans/7.2/modules/ext/junit-4.10.jar :. Spumevaluador) Я получаю эту ошибку:

minyatur @ Оромэ: ~/Codigo $ ./ejecuta.sh Hola Исключение в потоке "главный" java.lang.NoClassDefFoundError: тест/TestSuma (неправильное название: TestSuma) в java.lang.ClassLoader.defineClass1 (Родной метод) на 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 (URLClas sLoader.java:355) at java.security.AccessController.doPrivileged (собственный метод) на 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 не находит test.TestSuma, если я изменю Class.forname («TestSuma»); и включают в себя ./test в classpath, он отлично работает.

Почему? Есть идеи?

ответ

1

Похоже, что ваш класс TestSuma определен в пакете по умолчанию вместо тестового пакета. Попробуйте добавить:

package test; 

наверху файла TestSuma.java.

Путь Java classpath содержит места, где Java может найти корень иерархии пакетов. Если у вас есть класс в тестовом пакете, вам нужно поместить каталог, содержащий подкаталог «test» в пути к классам, а не сам тестовый подкаталог.

1

В основном при запуске Class.forName("test.TestSuma") он пытается загрузить класс под названием TestSuma в пакете под названием test. Он ищет это в файле класса с именем TestSuma.class в каталоге с именем test.

Он находит файл - но класс, который загружает это фактически называется TestSuma в пакете по умолчанию ... так что не удается.

Это не совсем понятно, что вы пытается достичь, но вы должны держать файлы классы в структуре, которая соответствует структуре пакетов, и только попытаться загрузить файлы, используя их надлежащего полного имени класса ,

+0

Прошу прощения, это глупая ошибка. тест пакета не был определен в TestSuma.java. – minyatur

+0

@minyatur: Посмотрите на * исходный код * для 'TestSuma'. Он не будет объявлен в пакете 'test', но вы * попросили * для класса, который находится в пакете' test'. Поэтому, хотя Java находит файл, он знает, что он * не нашел класс, о котором вы просите. Вы должны заставить их совпасть. Пакеты * не являются * просто вопросом, где находятся классы. –

Смежные вопросы