3

我在 CentOS 上运行 Jenkins 1.478,使用 Java 6、Maven 3.0.4、JUnit 4.8.1(Maven 项目中的依赖项)和 Sonar 3.2.1。我有我的 Jenkins Maven 2/3 作业设置以在完成后运行声纳(设置目标为“clean package -Pdev”)。该项目是一个包含 WAR 和 EAR 模块的多模块项目。但是,当插件的 Sonar 部分运行时,许多测试会因以下错误而死掉……</p>

java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Properties.java:418)
        at java.util.Properties.load0(Properties.java:337)
        at java.util.Properties.load(Properties.java:325)
        at org.parentco.myco.client.test.AbstractHibernateDaoTest.loadmyprojectProps(AbstractHibernateDaoTest.java:252)
        at org.parentco.myco.client.test.AbstractHibernateDaoTest.setupMockEjbContainer(AbstractHibernateDaoTest.java:235)
        at org.parentco.myco.client.test.AbstractHibernateDaoTest.setupBeforeClass(AbstractHibernateDaoTest.java:72)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)

异常来自此代码块的最后一行...

    final InputStream in = AbstractHibernateDaoTest.class.getClassLoader().getResourceAsStream("myproject.properties");
    final Properties props = new Properties();
    props.load(in);

测试在我工作的 Maven 部分完美运行。有问题的文件位于

./myclient-war/src/main/resources/myproject.properties

任何人都知道我可以如何进一步解决这个问题?我更愿意在 Sonar 中配置一些东西,而不是不得不重组我的整个项目以适应 Sonar,但我愿意接受建议。

4

3 回答 3

1

这可能是由于 Sonar 为运行每个测试创建了一个单独的类加载器,尽管我不太确定。

我相信所有失败的测试都遵循层次结构?

YourTestClass 扩展 AbstractHibernateDaoTest

尝试使用直接测试类的类加载器加载文件,YourTestClass而不是总是尝试使用类加载器加载它AbstractHibernateDaoTest

尝试将您的代码更改为,

final InputStream in = this.getClass().getClassLoader()
                        .getResourceAsStream("myproject.properties");
final Properties props = new Properties();
props.load(in);

这将确保您获得实际测试类的类对象而不是抽象类,以及直接类的类加载器而不是已经加载的类。

更新: 我觉得正在发生的事情是,无论您的代码中使用什么类加载器来加载资源,都无法看到 Maven 的类加载器。请注意,在您的情况下,Maven 尤其是 maven-surefire-plugin 负责设置正确的类路径。它将src/main/resources在类路径上添加目录。

于 2012-10-11T08:21:37.707 回答
0

一种可能性是这个问题

基于 Spring 的 junit 测试与 Sonar 使用的 Cobertura 插件发生冲突。解决方法是使用 JaCoCo 或 EMMA 插件而不是 Cobertura。

于 2013-08-02T07:57:30.087 回答
0

试试“/myproject.properties”。

ClassLoader cl = AbstractHibernateDaoTest.class.getClassLoader();  
InputStream inTmp = cl.getResourceAsStream("myproject.properties");
if(itTmp==null){
    itTmp=cl.getResourceAsStream("/myproject.properties");
}
final InputStream in = inTmp;
于 2012-10-11T06:39:47.590 回答