Хорошо, я расстроен! Я охотился вокруг в течение многих часов, и я все еще в тупике.
Окружающая среда: WinXP, Eclipse Galileo 3.5 (прямое установление - без дополнительных плагинов).
Итак, у меня есть простой тест JUnit. Он отлично работает из внутренней конфигурации Eclipse JUnit. Этот класс не имеет никакого отношения ни к чему. Чтобы максимально уменьшить эту проблему, она просто содержит:
@Test
public void testX() {
assertEquals("1", new Integer(1).toString());
}
Пока нет пота. Теперь я хочу сделать супер-продвинутый шаг запуска этого тестового примера из Ant (конечной целью является интеграция с Hudson).
Итак, я создаю файл build.xml:
<project name="Test" default="basic">
<property name="default.target.dir" value="${basedir}/target" />
<property name="test.report.dir" value="${default.target.dir}/test-reports" />
<target name="basic">
<mkdir dir="${test.report.dir}" />
<junit fork="true" printSummary="true" showOutput="true">
<formatter type="plain" />
<classpath>
<pathelement path="${basedir}/bin "/>
</classpath>
<batchtest fork="true" todir="${test.report.dir}" >
<fileset dir="${basedir}/bin">
<include name="**/*Test.*" />
</fileset>
</batchtest>
</junit>
</target>
</project>
${basedir} - это имя проекта Java в рабочей области, которая содержит исходный код, классы и файл сборки. Все .java и build.xml находятся в ${basedir}/src. Файлы .class находятся в ${basedir}/bin.
Я добавил eclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jar в класс Ant Runtime Classpath через Windows/Preferences/Ant/Runtime/Contributed Entries. ant -junit.jar находится в Ant Домашних записях.
Итак, что происходит, когда я запускаю эту безумно сложную цель? Мой файл отчета содержит:
Testsuite: com.xyz.test.RussianTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
Testcase: initializationError took 0 sec
Caused an ERROR
org/hamcrest/SelfDescribing
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Что это за класс org.hamcrest.SelfDescribing? Что-то делать с насмешками? Хорошо. Но почему зависимость? Я ничего не делаю с этим. Это буквально проект Java без зависимостей, кроме JUnit.
Вставлено (и расстроено)!!