2

cobertura mavenプラグインを使用して、Springベースのアプリケーションのテストコードカバレッジに関するレポートを作成しています。私の単体テストは次のように構成されています。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/testAppContext.xml")
public class TestCase extends TestBase

testAppContext.xml-/src/test/resources/testAppContext.xmlにあるSpringIOC構成

そして、私のcoberturaの関連するpom.xml部分は次のとおりです。

<build>
...
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>clean</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
...
<build>

<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
        </plugin>
    </plugins>
</reporting>

「mvncleaninstall」を作成すると正常に動作しますが、「mvn site」を作成すると、「Autowired依存関係の挿入に失敗しました」という基になる「ApplicationContextの読み込みに失敗しました」が原因でスプリングベースのテストが失敗し、誤ったレポートを受け取りますテストカバレッジについて。

これは、「サイト」の目標などでtestAppContext.xmlがクラスパスにないことが原因である可能性があります。この問題を解決する方法について何か提案はありますか?

ご協力ありがとうございました!

4

1 に答える 1

4

春のエラーの取得からの私の答えを引用すると、 「'x'という名前のBeanはタイプ[y]である必要がありますが、実際にはJenkinsではタイプ[$Proxy]でした」 :

Coberturaの問題は、いくつかのカスタムインターフェイスの追加を含め、かなり重いバイトコードインストルメンテーションを実行することです。Springが起動すると、Beanのプロキシが生成されます。Beanに少なくとも1つのインターフェースがある場合、それは標準のJavaプロキシーを使用します。それ以外の場合は、クラスベースのプロキシを作成しようとします。

あなたの場合、CGLIBクラスプロキシが使用されたと思いますが、Coberturaインストルメンテーションの後、SpringはJavaプロキシにフォールバックします。依存性注入がクラス(またはCGLIBサブクラス)を予期していたため、これにより起動エラーが発生しました。

長い話を短くするには、CGLIBクラスプロキシを強制すると問題ありません。

<aop:config proxy-target-class="true"/>

症状は同じではありませんが、ここでも上記のトリックが役に立ちました。

于 2012-12-20T18:22:09.947 に答える