2010-03-22 2 views
1

У меня проблемы с запуском теста JUnit.getPackage() возвращает null, когда мой тест JUnit запускается из Ant

Он отлично работает в Eclipse, но теперь я пытаюсь запустить его из командной строки с помощью Ant. Проблема в том, что следующий код возвращает null: getClass().getPackage().

Я бегу мой JUnit тест так:

<junit fork="no" printsummary="yes" haltonfailure="no"> 
     <classpath refid="junit.classpath" /> 
     <batchtest fork="yes" todir="${reports.junit}"> 
      <fileset dir="${junit.classdir}"> 
       <include name="**/FileHttpServerTest.class" /> 
       <exclude name="**/*$*" /> 
      </fileset> 
     </batchtest> 
     <formatter type="xml" /> 
     ... 

Я Googled для такого рода ошибок, и нашел несколько ссылок на ClassLoader проступок. Но я ничего не нашел, дал мне достаточно информации, чтобы решить мою проблему.

Мне действительно нужно getClass().getPackage(), чтобы не вернуть null. Может кто-нибудь мне помочь?

Спасибо, Фил

+0

Не могли бы вы отправить код, который вы используете getClass(). GetPackage call? –

ответ

1

Я не уверен, на каком объекте вы пытаетесь сделать GetClass(). GetPackage()? Глядя на то, что говорит API Javadoc для этого метода, я бы предположил, что проблема заключается в том, что JUnit загружается загрузчиком классов Bootstrap, когда вы запускаете его из командной строки, тогда как объект, на котором выполняется операция getPackage(), загружается одним дочерних загрузчиков классов.

Не уверен, что это имеет смысл, но поскольку getPackage пытается найти пакет с использованием загрузчика классов Bootstrap, а поведение загрузчика стандартного класса не смотрит на его дочерние элементы, он возвращает null.

Если вы можете дать больше представления об объекте, на котором вы делаете эту операцию, я мог бы быть более конкретным

+0

Hi Fazal, Первоначально я наблюдал проблему в классе сторонних Jetty 'org.mortbay.jetty.Server' - он вызывает getClass(). GetPackage(). GetImplementationVersion(), который вызывает исключение NullPointerException. Затем я добавил следующую строку в моей самой ('FileHttpServerTest') тестовый класс: ' System.out.println (. "Пакет" + GetClass() getPackage()); ' Этот пакет печатает» является ноль". –

1

Попробуйте запустить тесты с junit fork="yes", что изолирует ваши загрузки классов довольно разумно и может решить вашу проблему.

+0

Спасибо Yishai, я пробовал это, и это не имело значения –

+0

@philharvey, что не изменилось, ваш собственный класс FileHttpServerTest или класс Jetty или оба? – Yishai

+0

К сожалению, это не повлияло на результат вызова getObject(). GetPackage() в любом классе –

1

Если это вина загрузчики классов, вы всегда можете загрузить один и тот же класс, используя различные загрузчик классов:

URLClassLoader cld = new URLClassLoader(new URL[] { urlsToClasses }); 
Class.forName(getClass().getName(), true, cld).getPackage(); 

Проблема здесь, чтобы выяснить, как найти путь класса URLs (urlsToClasses). Я не знаком с загрузчиками классов JUnit, поэтому вы можете попробовать лить Thread.currentThread().getContextClassLoader() в URLClassLoader, чтобы узнать, может ли он помочь вам получить эти URL-адреса.

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