我在运行JUnit测试时遇到问题。
它在Eclipse中运行良好,但现在我正在尝试使用Ant从命令行运行它。问题是以下代码返回null:getClass().getPackage()
。
我正在运行我的JUnit测试:
<junit fork="no" printsummary="yes" haltonfailure="no">
<classpath refid="junit.classpath" />
<batchtest fork="yes" todir="${reports.junit}">
<fileset dir="${junit.classdir}">
<include name="**/FileHttpServerTest.class" />
<exclude name="**/*$*" />
</fileset>
</batchtest>
<formatter type="xml" />
...
我用Google搜索了这种错误,并发现了一些对类加载器错误行为的引用。但我发现什么都没有给我足够的信息来解决我的问题。
我真的需要getClass().getPackage()
不返回null。任何人都可以帮助我吗?
谢谢, 菲尔
答案 0 :(得分:1)
我不确定你想在哪个对象上做getClass()。getPackage()? 看看API Javadoc对这个方法所说的内容,我猜想问题是当你从命令行运行它时,BootUnrap类加载器正在加载JUnit,而你正在执行getPackage()操作的对象是由其中一个加载的。儿童类加载器。
不确定这是否有意义,但是因为getPackage试图使用Bootstrap类加载器来定位包,并且标准类加载器行为不会查看其子类,所以它返回null。
如果您可以更多地了解您正在执行此操作的对象,我可能会更具体
答案 1 :(得分:1)
尝试使用junit fork="yes"
运行您的测试,这将合理地隔离您的类加载并可能解决您的问题。
答案 2 :(得分:1)
如果是类加载器的错误,您总是可以使用不同的类加载器加载相同的类:
URLClassLoader cld = new URLClassLoader(new URL[] { urlsToClasses });
Class.forName(getClass().getName(), true, cld).getPackage();
这里的问题是弄清楚如何查找类路径网址(urlsToClasses
)。我不熟悉JUnit类加载器,因此您可以尝试将Thread.currentThread().getContextClassLoader()
转换为URLClassLoader
以查看它是否可以帮助您获取该URL。