2

我正在使用 cobertura maven 插件来生成关于我的基于 spring 的应用程序的测试代码覆盖率的报告。我的单元测试配置为:

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

testAppContext.xml - 位于 /src/test/resources/testAppContext.xml 的 Spring IOC 配置

而我的 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>

当我制作“mvn clean install”时它工作正常,但是当我制作“mvn site”时-基于弹簧的测试失败,因为“加载ApplicationContext失败”和底层“自动装配依赖注入失败”,所以我收到不正确的报告关于测试覆盖率。

我认为这可能是因为 testAppContext.xml 在“站点”目标或其他东西期间不在类路径上。任何建议如何解决这个问题?

谢谢您的帮助!

4

1 回答 1

4

引用我从Getting Spring Error "Bean named 'x' must be of type [y], but 实际上是 type [$Proxy]" in Jenkins 中的回答:

Cobertura 的问题在于它执行相当繁重的字节码检测,包括添加一些自定义接口。当 Spring 启动时,它会为 bean 生成代理。如果 bean 至少有一个接口,它使用标准的 Java 代理。否则它会尝试创建基于类的代理。

我猜在你的情况下,使用了 CGLIB 类代理,但在 Cobertura 检测 Spring 后回退到 java 代理。这会导致启动错误,因为依赖注入预期的类(或 CGLIB 子类)。

长话短说,强制 CGLIB 类代理,你会没事的:

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

症状不一样,但显然上面的技巧在这里也有帮助。

于 2012-12-20T18:22:09.947 回答