Ant + JUnit = ClassNotFoundExceptions при запуске тестов? - PullRequest
4 голосов
/ 22 апреля 2010

Я пытаюсь запустить некоторые тесты в Ant в настоящее время, используя JUnit, и все мои тесты не выполняются со следующей трассировкой стека:

java.lang.ClassNotFoundException: com.mypackage.MyTestCase

Это не имеет для меня особого смысла.Сначала я компилирую свои тестовые примеры, используя <javac>, а затем непосредственно запускаю задачу <junit> для запуска тестов.Мой сборочный файл выглядит так:

<target name="compile.webapp.tests" depends="compile.webapp">
    <javac srcdir="${test.java.src.dir}"
            destdir="${test.java.bin.dir}">
        <classpath>
            <filelist>
                <file name="${red5.home}/red5.jar"/>
                <file name="${red5.home}/boot.jar"/>
                <file name="${bin.dir}/${ant.project.name}.jar"/>
            </filelist>
            <fileset dir="${red5.lib.dir}" includes="**/*"/>
            <fileset dir="${main.java.lib.dir}" includes="**/*"/>
            <fileset dir="${test.java.lib.dir}" includes="**/*"/>
        </classpath>
    </javac>
</target>

<target name="run.webapp.tests" depends="compile.webapp.tests">
    <junit printsummary="true">
        <classpath>
            <filelist>
                <file name="${red5.home}/red5.jar"/>
                <file name="${red5.home}/boot.jar"/>
                <file name="${bin.dir}/${ant.project.name}.jar"/>
            </filelist>
            <fileset dir="${red5.lib.dir}" includes="**/*.jar"/>
            <fileset dir="${main.java.lib.dir}" includes="**/*.jar"/>
            <fileset dir="${test.java.lib.dir}" includes="**/*.jar"/>
            <fileset dir="${test.java.bin.dir}" includes="**/*.class"/>
        </classpath>

        <formatter type="xml"/>

        <batchtest todir="${test.java.output.dir}">
            <fileset dir="${test.java.bin.dir}" includes="**/*TestCase*"/>
        </batchtest>
    </junit>

    <junitreport>
        <fileset dir="${test.java.output.dir}" includes="**/*"/>
        <report todir="${test.java.report.dir}"/>
    </junitreport>
</target>

Это действительно странно, я не могу это исправить.Я что-то здесь не так делаю?Структура каталога моего проекта выглядит примерно так:

${basedir}/src/test/java # this is "test.java.src.dir"
${basedir}/build/test/java # this is "test.java.bin.dir"
${basedir}/lib/main/java # this is "main.java.lib.dir"
${basedir}/lib/test/java # this is "test.java.lib.dir"
${basedir}/build/test/junit # this is "test.java.output.dir"

Мой полный файл сборки доступен здесь: http://pastebin.com/SVnciGKRМой файл свойств доступен здесь: http://pastebin.com/9LCtNQUq


ОБНОВЛЕНИЕ

Изменив мои цели так, как показано ниже, я смог заставить все работать.К сожалению, мне приходится вручную вставлять ant-junit.jar и junit.jar в мой репозиторий, но это работает, так что, думаю, это решит проблему.Если кто-нибудь может помочь мне избавиться от необходимости встраивать ant-junit.jar и junit.jar, я был бы очень признателен:

<path id="webapp.tests.path" >
    <pathelement location="${red5.home}/red5.jar"/>
    <pathelement location="${red5.home}/boot.jar"/>
    <pathelement location="${bin.dir}/${ant.project.name}.jar"/>
    <pathelement path="${red5.lib.dir}"/>
    <pathelement path="${main.java.lib.dir}"/>
    <pathelement path="${test.java.lib.dir}"/>
</path>

<target name="compile.webapp.tests" depends="compile.webapp">
    <javac srcdir="${test.java.src.dir}"
            destdir="${test.java.bin.dir}">
        <classpath refid="webapp.tests.path"/>
    </javac>
</target>

<target name="run.webapp.tests" depends="compile.webapp.tests">     
    <junit printsummary="true">
        <classpath>
            <path refid="webapp.tests.path"/>
            <pathelement location="${test.lib.dir}/ant/ant-junit.jar"/>
            <pathelement location="${test.lib.dir}/ant/junit-4.8.2.jar"/>
            <pathelement path="${test.java.bin.dir}"/>
        </classpath>

        <formatter type="xml"/>

        <batchtest todir="${test.java.output.dir}">
            <fileset dir="${test.java.bin.dir}" includes="**/*TestCase*"/>
        </batchtest>
    </junit>

    <junitreport todir="${test.java.report.dir}">
        <fileset dir="${test.java.output.dir}" includes="**/*"/>
        <report todir="${test.java.report.dir}"/>
    </junitreport>

    <delete file="${test.java.report.dir}/TESTS-TestSuites.xml"/>
</target>

Если я не включу банки в classpath,Я получаю сообщение об ошибке, сообщающее, что junit.jar должен быть в пути к классам, чтобы запустить задачу <junit>.Странно, да?

Ответы [ 3 ]

4 голосов
/ 29 мая 2011

В соответствии с документацией ANT для Задача JUnit вам нужно выполнить одну из следующих опций, чтобы запустить тесты junit, поскольку существует зависимость от junit.jar, который является внешним по отношению к ANT:

Примечание: у вас должен быть junit.jar имеется в наличии. Вы можете сделать одно из:

  1. Поместите и junit.jar, и ant-junit.jar в ANT_HOME / lib.
  2. Не помещайте ни в ANT_HOME / lib, а вместо этого включайте их расположение в ваша переменная среды CLASSPATH.
  3. Добавьте оба JAR-файла в ваш путь к классу, используя -lib.
  4. Укажите расположение обоих JAR-файлов, используя элемент в в файле сборки.
  5. Оставьте ant-junit.jar по умолчанию в ANT_HOME / lib, но включите junit.jar в переданном . (начиная с Муравья 1.7)

Я убедился, что # 1, поместив junit.jar в ANT_HOME \ lib, работал (ant-junit.jar уже был там, ANT 1.8.0), и мне не нужно было , чтобы указать junit. jar в пути к классам для тега JUNIT. По сути, вы выбрали вариант № 5.

3 голосов
/ 22 апреля 2010

Я думаю, что это проблема:

<junit printsummary="true">
  <classpath>
    ...
    <fileset dir="${test.java.bin.dir}" includes="**/*.class"/>
  </classpath>

Я считаю, что путь к классам не должен включать файлы .class напрямую, только корень каталога bin.

<junit printsummary="true">
  <classpath>
    ...
    <pathelement path="${test.java.bin.dir}"/>
  </classpath>

Хороший способ отладки - подробный запуск сборки и тщательный анализ пути к классам, чтобы убедиться, что он установлен так, как вы ожидаете. Смотрите Ant параметры командной строки -verbose и, возможно, -debug.

Я удивлен, что установил classpath с использованием только элементов fileset и file вместо pathelement s. Взгляните на руководство по Ant для Path-like Structures , чтобы узнать, что я имею в виду.

Наконец, дублирование между классами в javac и junit может вызвать проблемы в будущем. Вы, вероятно, захотите назвать определенные пути или набор путей, чтобы не дублировать их. См. Руководство по Ant для Ссылки .

0 голосов
/ 22 апреля 2010

Вам нужно сослаться на $ {test.java.bin.dir} в вашем пути к классу задач junit.

Редактировать: Хм, если под "все еще не удается" вы имеете в виду ту же ошибку, то мое следующее предположение состоит в том, что что-то должно быть запутано относительно того, где находится корневой каталог относительно места запуска пакетов, но мне нужно знать больше о вашей структуре каталогов, чтобы быть уверенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...