【问题标题】:Spring ApplicationContext loading in cobertura-maven-plugin tests在 cobertura-maven-plugin 测试中加载 Spring ApplicationContext
【发布时间】:2025-11-21 08:20:03
【问题描述】:

我正在使用 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 在“站点”目标或其他情况下不在类路径中。有什么建议可以解决这个问题吗?

感谢您的帮助!

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?也可以看看:*.com/questions/8391944
  • @TomaszNurkiewicz 它也适用于我的情况。我在堆栈跟踪中没有“名为 'x' 的 Bean 必须是 [y] 类型,但实际上是 [$Proxy] 类型”,所以我没有机会找到这个解决方案。感谢您的回答和此链接!

标签: spring unit-testing dependency-injection code-coverage cobertura


【解决方案1】:

引用Getting Spring Error "Bean named 'x' must be of type [y], but was actually of type [$Proxy]" in Jenkins的回答:

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

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

长话短说,强制使用 CGLIB 类代理就可以了:

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

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

【讨论】:

    最近更新 更多