You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring测试上下文复用与循环依赖规避问题求助

解决方案

方案1:抽离测试公共模块(推荐)

把Project A中通用的测试上下文代码(TestContext、FooTestConfig)抽成独立的Project C,作为所有模块的测试依赖,彻底解决循环问题:

步骤1:创建Project C的结构

Project C
├── main/java/packageName
│   └── (无需主代码,或放通用测试工具类)
├── test/java/packageName
│   ├── TestContext.java
│   └── FooTestConfig.java

步骤2:配置Project C的pom.xml

确保打包测试代码为test-jar,供其他模块依赖:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>test-jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

步骤3:修改Project A的pom.xml

移除自身的TestContext和FooTestConfig,添加对Project C的test-jar依赖:

<dependencies>
    <!-- 原有对Project B的依赖保留 -->
    <dependency>
        <groupId>your.groupId</groupId>
        <artifactId>project-c</artifactId>
        <version>your.version</version>
        <scope>test</scope>
        <type>test-jar</type>
    </dependency>
</dependencies>

步骤4:配置Project B的pom.xml

添加对Project C的test-jar依赖,若测试需要Project A的FooConfig,可单独依赖Project A的主jar(而非test-jar):

<dependencies>
    <!-- 测试需要Project A的FooConfig时添加 -->
    <dependency>
        <groupId>your.groupId</groupId>
        <artifactId>project-a</artifactId>
        <version>your.version</version>
        <scope>test</scope>
    </dependency>
    <!-- 依赖Project C的测试上下文 -->
    <dependency>
        <groupId>your.groupId</groupId>
        <artifactId>project-c</artifactId>
        <version>your.version</version>
        <scope>test</scope>
        <type>test-jar</type>
    </dependency>
</dependencies>

步骤5:编写Project B的测试类

现在可以正常继承TestContext,同时注入BarBean:

public class BarBeanTest extends TestContext {

    @Autowired
    private BarBean barBean;

    // 测试方法...
}

方案2:Project B独立编写测试上下文(无需新增模块)

如果不想新增Project C,直接在Project B中编写独立的测试配置,不依赖Project A的TestContext:

编写Project B的测试类

只需要指定自身的BarConfig作为配置类即可:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = BarConfig.class)
public class BarBeanTest {

    @Autowired
    private BarBean barBean;

    // 测试方法...
}

如果测试需要Project A的FooConfig(比如FooConfig中有其他必要的Bean),可以直接引入:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {FooConfig.class, BarConfig.class})
public class BarBeanTest {

    @Autowired
    private BarBean barBean;

    // 测试方法...
}

这种方式仅需依赖Project A的主jar(scope设为test),不会形成循环依赖。

方案3:将测试公共类移至Project A的主模块(不推荐)

如果不想新增模块,也可以把TestContext、FooTestConfig移到Project A的main/java下(比如放在com.example.test.support包),这样Project B可以直接依赖Project A的主jar来使用这些类。但这种方式会把测试代码混入生产代码包,不符合规范,仅作为临时方案。


内容的提问来源于stack exchange,提问作者mango10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:31:01