How do I load a properties file with JUnit / Ant?

11,856

Solution 1

Attempting to load a resource from getClass().getResourceAsStream() will cause db.properties to be looked for based on the package name of the class, i.e. in a directory (in the classpath) like com/criticalmass/infinitiusa/....

Instead, to load from the root of the classpath, try something like

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

Solution 2

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

Try "/db.properties" instead. See Class.getResourceAsStream()

For Ant, file paths are resolved relative to the working directory. So if running from the project root, the file would be in src/${db-props-file}.

Share:
11,856
Dave
Author by

Dave

Updated on August 21, 2022

Comments

  • Dave
    Dave over 1 year

    I'm using Ant 1.8, JUnit 4.8.2. I'm trying to load a properties file and having some problems. The properties file is at the root of my source directory and I load that into the classpath as well as explicitly loading the properties file in the classpath. Below is my ant build.xml file. Here is how I'm trying to load the properties …

    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
    

    It always fails with null (properties were not loaded).

    <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>
    

    Anyone know the correct way to load the properties file? Thanks, - Dave

  • Jesse Webb
    Jesse Webb almost 13 years
    This sounds right to me. I think the preferred way of acessing the ContextClassLoader is through the current class. So (I think) this would be even better: getClass().getContextClassLoader().getResourceAsStream("db.p‌​roperties");
  • Dave
    Dave almost 13 years
    Winner! Gweebz, why do you say one way is preferred over another?