Не удается найти файл свойств внутри Jar во время тестов Junit через Ant - PullRequest
3 голосов
/ 08 декабря 2008

У меня проблемы с запуском моих тестов Junit через Ant. Я не могу заставить Ant увидеть файл свойств, необходимый для загрузки библиотеки, в которой нуждается мой проект. Все мои тесты работают с использованием графического интерфейса Junit в Elcipse, так что я уверен, что это не проблема самих тестов. Я думаю, что моя проблема связана с classpath, но я не могу ее найти.

структура банки: /root/folder/../Foo.properties

Вот как файл свойств загружается в библиотеку:

// load class properties
props = PropertyLoader.loadProperties(Foo.class);

public static Properties loadProperties(Class className) {
    return loadProperties(className.getName());
}

public static Properties loadProperties(final String propsName) {
    Properties props = null;
    InputStream in = null;
    try {
      ClassLoader cl = ClassLoader.getSystemClassLoader();
      String name = propsName.replace('.', '/').concat(".properties");

      in = cl.getResourceAsStream(name);
      if (in != null) {
        props = new Properties();
        props.load(in);
      }
    }
    catch (Exception e) {
      props = null;
    }
    finally {
      if (props == null) {
        System.err.print("Property file " + propsName + " doesn't exist. System terminated.");
        System.exit(0);
      }
    }

    return props;
  }

За исключением рассматриваемого файла сборки:

<!-- Pattern of source files to copy into classpath-->
    <property name="source.files.tocopy"
        value="**/*.properties,**/*.dtd,**/*.xml,**/*.jpg" />

    <path id="compile.classpath">
        <fileset dir="lib">
            <include name="*.jar" />
        </fileset>
    </path>

    <!-- Generate Class-Path entry for the JAR's Manifest -->
    <pathconvert property="manifest.classpath" 
        pathsep=" " dirsep="\">
        <map from="${basedir}/" to="" />
        <fileset dir="lib">
            <include name="*.jar" />
        </fileset>
    </pathconvert>

    <!-- Run tests against the JAR -->
    <path id="test.compile.classpath">
        <path refid="compile.classpath" />
        <pathelement location="${target.jar}" />
    </path>

    <path id="test.classpath">
        <path refid="test.compile.classpath" />
        <pathelement location="${test.classes.dir}" />
    </path>



    <!-- - - - - - - - - - - - - - - - - - 
          target: test-compile                      
         - - - - - - - - - - - - - - - - - -->
    <target name="test-compile" depends="compile, test-init"
        description="Compiles our testing code">

        <javac destdir="${test.classes.dir}"
                debug="true"
                includeAntRuntime="true"
                srcdir="test">
            <classpath refid="test.compile.classpath" />
        </javac>

        <copy todir="${test.classes.dir}">
            <fileset dir="test" includes="${source.files.tocopy}"/>
            <fileset dir="resources" includes="${source.files.tocopy}"/>
        </copy>

    </target>


    <!-- ================================= 
          target: test              
         ================================= -->
    <target name="test" depends="test-compile, optional-tests">

        <description>
            Runs our tests, generates reports, and stops 
            the build on failure.  Optionally runs one test.
        </description>

        <junit printsummary="false" 
            errorProperty="test.failed" 
            failureProperty="test.failed">
            <classpath>
                <path refid="test.classpath" />
            </classpath>            
            <sysproperty key="test.properties" value="${test.properties.file}"/>
            <formatter type="brief" usefile="false" />
            <formatter type="xml" />
            <test name="${testcase}" todir="${test.data.dir}" if="testcase" />
            <batchtest todir="${test.data.dir}" unless="testcase">
                <fileset dir="${test.classes.dir}">
                    <patternset>
                        <include name="**/test/*Test.class" />
                        <exclude name="**/test/*Printer*.class" unless="test.properties.file" />
                    </patternset>
                </fileset>
            </batchtest>
        </junit>

Я действительно мог бы использовать второй набор глаз, поэтому любая помощь приветствуется. Заранее спасибо!

- Charly

Ответы [ 3 ]

2 голосов
/ 10 декабря 2008

Я обнаружил, что в некоторых случаях файл свойств, если он находится внутри банки, не может находиться в корневой папке. Переместите его в каталог внутри фляги и затем используйте getResourceAsStream.

Karl

2 голосов
/ 08 декабря 2008

Попробуйте использовать getResource, чтобы увидеть, какой URL-адрес возвращается в eclipse, а также посмотреть, сможете ли вы получить URL-адрес для показа в модульном тесте. Может быть, вам нужно передать имя фактического файла класса, чтобы получить это

clazz.getResource(clazz.getName()+".class")

Убедитесь, что файлы копируются перед запуском модульного теста, чтобы файлы фактически помещались в выходную папку, которая используется в classpath при запуске модульного теста.

Когда eclipse компилирует java-файлы, он также автоматически копирует все не-java-файлы в выходной каталог. Вот почему файл доступен в classpath в eclipse. Если вы не скопируете не-Java-файлы в целевую папку сборки во время компиляции, файлы свойств не будут скопированы. Судя по вашим файлам сборки, вы уже копируете файлы. Можете ли вы проверить то же самое при просмотре папок?

Кроме того, вы никогда не должны использовать System.exit (0) в своем коде, за исключением небольших программ. Лучше иметь исключения, которые распространяются на основную функцию и завершают программу. Причина в том, что в итоге вы получите библиотеку, которая прервет процесс Java, когда он будет использован и завершится неудачей.

0 голосов
/ 08 декабря 2008

Первые шаги отладки ant всегда:

  1. ant -verbose
  2. ant -debug

Просмотрите выходные данные для тех целей, которые относятся к тестам junit.

Если вы найдете там дополнительную информацию, которая решает проблему, отлично! Если нет, то отредактируйте вопрос с соответствующей информацией из вывода.

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