Как мне загрузить файл свойств с помощью JUnit / Ant?

#java #ant #junit

#java #ant #junit

Вопрос:

Я использую Ant 1.8, JUnit 4.8.2. Я пытаюсь загрузить файл свойств и сталкиваюсь с некоторыми проблемами. Файл свойств находится в корне моего исходного каталога, и я загружаю его в classpath, а также явно загружаю файл свойств в classpath. Ниже приведен мой ant build.xml файл. Вот как я пытаюсь загрузить свойства …

 private void loadTestProperties() { 
    try { 
        Properties prop = new Properties();
        InputStream in = getClass().getResourceAsStream("db.properties");
        prop.load(in);
        in.close();
    } catch (Exception e) { 
        fail("Failed to load properties: "   e.getMessage());
    }   // try
}   // loadTestProperties
  

Он всегда завершается с ошибкой null (свойства не были загружены).

 <project name="leads-testing" default="build" basedir=".">
  <property name="tst-dir" location="/Users/davea/Documents/workspace-sts-2.6.0.SR1/infinitiusa_leads_testing/test" />
  <property name="db-props-file" location="/Users/davea/Documents/workspace-sts-2.6.0.SR1/infinitiusa_leads_testing/test/db.properties" />
  <property name="TALK" value="true" />

  <path id="classpath.base">
  </path>
  <path id="classpath.test">
    <pathelement location="lib/junit-4.8.2.jar" />
    <pathelement location="lib/selenium-java-client-driver.jar" />
    <pathelement location="lib/classes12.jar" />
    <pathelement location="${tst-dir}" />
    <pathelement location="${db-props-file}" />
    <path refid="classpath.base" />
  </path>

  <target name="compile-test">
    <javac srcdir="${tst-dir}"
           verbose="${TALK}"
           >
      <classpath refid="classpath.test"/>
    </javac>
  </target>
  <target name="clean-compile-test">
    <delete verbose="${TALK}">
      <fileset dir="${tst-dir}" includes="**/*.class" />
    </delete>
  </target>

  <target name="test" depends="compile-test">
    <junit>
      <classpath refid="classpath.test" />
      <formatter type="brief" usefile="false" />
      <test name="com.criticalmass.infinitiusa.tests.InfinitiConfigOldG25Base" />
    </junit>
  </target>

  <target name="all" depends="test" />
  <target name="clean" depends="clean-compile-test" />
</project>
  

Кто-нибудь знает правильный способ загрузки файла свойств? Спасибо, — Дэйв

Ответ №1:

Попытка загрузить ресурс из getClass().getResourceAsStream() приведет db.properties к поиску на основе имени пакета класса, то есть в каталоге (в classpath), подобном com/criticalmass/infinitiusa/... .

Вместо этого, для загрузки из корня classpath, попробуйте что-то вроде

 InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
  

Комментарии:

1. Для меня это звучит правильно. Я думаю, что предпочтительный способ доступа к ContextClassLoader — через текущий класс. Итак (я думаю), это было бы еще лучше: getClass().getContextClassLoader().getResourceAsStream(«db.properties»);

2. Победитель! Gweebz, почему ты говоришь, что один способ предпочтительнее другого?

Ответ №2:

 InputStream in = getClass().getResourceAsStream("db.properties");
  

Попробуйте "/db.properties" вместо этого. Смотрите Class.getResourceAsStream()

Для Ant пути к файлам разрешаются относительно рабочего каталога. Таким образом, при запуске из корня проекта файл будет находиться в src/${db-props-file} .