我在通过Ant运行Junit测试时遇到问题。我似乎无法让Ant看到它需要加载我的项目所需的DLL所需的属性文件。我所有的测试都使用了Elcipse中的Junit GUI,所以我很确定测试本身并不是问题。我认为我的问题与类路径相关,但我似乎无法找到问题。
jar结构: /根/文件夹/../ 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>
我真的可以使用第二组眼睛,所以任何帮助都会受到赞赏。提前谢谢!
- 查理
答案 0 :(得分:2)
尝试并使用getResource来查看在eclipse中返回的URL,并查看是否可以在单元测试中显示要显示的URL。也许您需要传递实际类文件的名称才能获得
clazz.getResource(clazz.getName()+".class")
在运行单元测试之前检查文件是否已复制,因此文件实际上放在运行单元测试时在类路径上使用的输出文件夹中。
当eclipse编译java文件时,它还会自动将所有非java文件复制到输出目录。这就是eclipse中类路径中可以访问该文件的原因。如果在编译期间未将非java文件复制到构建目标文件夹,则不会复制属性文件。虽然您已经在复制文件,但它确实从您的构建文件中查看。浏览文件夹时可以验证相同的内容吗?
此外,除了小程序之外,您不应该在代码中使用System.exit(0)。拥有传播到main函数并终止程序的异常最好。原因是你最终会得到一个库,它会在Java进程被使用时终止并失败。
答案 1 :(得分:2)
我发现在某些情况下,如果jar内的属性文件不能在根文件夹中。将其移动到jar内部的目录中,然后使用getResourceAsStream。
卡尔
答案 2 :(得分:0)
ant
调试的第一步始终是:
ant -verbose
ant -debug
查看与junit
测试相关的目标的输出。
如果您在那里找到解决问题的其他信息,那太好了!如果没有,请使用输出中的相关信息编辑问题。