3

Java 6、Maven 3.0.4、JUnit 4.8.1 (Maven プロジェクト内の依存関係)、および Sonar 3.2.1 を使用して、CentOS で Jenkins 1.478 を実行しています。Jenkins Maven 2/3 ジョブを設定して、完了後に Sonar を実行します (「クリーン パッケージ -Pdev」という目標を設定)。このプロジェクトは、WAR モジュールと EAR モジュールを含むマルチモジュール プロジェクトです。ただし、プラグインのソナー部分が実行されると、多くのテストが次のようなエラーで停止します...</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

「/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 に答える
0

1つの可能性はこの問題です:

Spring ベースの junit テストは、Sonar が使用する Cobertura プラグインと衝突します。回避策は、Cobertura の代わりに JaCoCo または EMMA プラグインを使用することです。

于 2013-08-02T07:57:30.087 に答える