以下是我的启动类,我工程是注解和 xml 混用.工程的 SpringBoot 版本是 2.3.X
@SpringBootApplication
@ImportResource({"classpath:spring/*.xml"})
public class A {
}
我有以下的单元测试类,我只想做数据层的单元测试
@DataJdbcTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import([SpringBootConfiguration.class, MybatisPlusAutoConfiguration.class])
public class B {
}
单元测试启动后,会扫描到我的启动类 A ,因此会读入 *.xml; *.xml 中的 bean 都是我不需要的,而且实例化费时.所以我想取消掉这些.我想到如下方法:
其中第二个方法,由于自己扩展的实现类的优先级肯定低于 Spring 自己的 ConfigurationClassPostProcessor,所以实际上运行到我自己实现的方法上时, *.xml 上的 bean 已经注册到 ApplicationContext 中了,所以我就在自己的实现类中 remove 掉这些我不需要的 bean. 问题是需要 remove 掉的 bean 有点多,也没有什么规律,一个个手写不太现实.所以我觉得最好的办法就是可以在运行时去掉 A 类上的注解 @ImportResource. 各位大佬,觉得有什么办法可以做到这点. 我用的是 Junit,所以有没有可能在 Junit 阶段做些什么?
1
guodong110 2020-08-23 21:26:04 +08:00
在测试目录写个,包路径和代码目录 A 一致
```java @SpringBootApplication //@ImportResource({"classpath:spring/*.xml"}) public class A { } ``` |
2
guodong110 2020-08-23 21:42:19 +08:00 1
|
3
b0644170fc OP @guodong110 谢谢这个方法可以.不过这会影响到其它人写的测试类
|
4
b0644170fc OP @guodong110 这样是可以.
|
5
guodong110 2020-08-23 22:56:43 +08:00 1
试试这个,这样自己的测试用例只用自己的启动类,不影响别人
```java @SpringBootApplication @ComponentScan(basePackages = "xxx", excludeFilters = @ComponentScan.Filter(SpringBootApplication.class)) //@ImportResource({"classpath:spring/*.xml"}) public class CustomeApplication { } @SpringBootTest(classes = CustomeApplication.class) public class xxx{ } ``` |