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
相关产品推荐
相关产品推荐

