SpringBootTest常见错误解决

1.启动类所在包错误

问题

由于启动类所在包与需要自动注入的类的包不在一个包下:

启动类所在包:

com.exmaple.test_02

但是对于需要注入的类却不在com.exmaple.test_02下或者其子包下,就会导致启动类无法扫描到该类,从而无法对该类进行管理,因此无法自动注入。

需要自动注入的类所在包: com.example.algotithm

解决方案

方案一:将需注入类的包移动到启动类包下

方案二:为启动类增加该类的路径扫描,从而让spring管理该类

@ComponentScan(basePackages = "com.example")

将com.exmaple下的所有添加了@Component,@Controller,@Service,@Repository等注解的类注册到容器中。

为什么需要在启动类所在包或者所在包的子包?

查看SpringBootApplication源码:

复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
  xxxx
}

我们可以看见注解中有@ComponentScan注解

复制代码
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

其中一个功能就是检查是否应用了 @ComponentScan 注解。(就是解决方案二中的配置)

如果使用就按照你配置的,没有就按照默认的

而如果按照默认的,那么就会 扫描当前包以及子包,将有@Component,@Controller,@Service,@Repository等注解的类注册到容器中。

因此为了不必要的问题,我们一般将启动类放到最外层,以便扫描所有类。

2.没有为类注解/没有添加自动注入注解

没有为类添加**@Component,@Controller,@Service,@Repository等注解**

添加注解即可

3.依赖未导入

如果项目分为多个module,而启动类所在的module,没有引入所需要的module(假定为A包),就会导致无法注入A包中的类。

多层结构演示:

测试类需要创建在启动类所在的module下:

此时需要对domain下的一个功能做测试,需要将所用到的类所在的module作为依赖引入。

相关推荐
markinmarkin9 小时前
Spring 中Bean 的作用域有哪些?
java·后端·spring
xiaoqiMikko12 小时前
Dependabot 面板全绿,不代表你的 Tomcat 没洞
java·spring boot
摇滚侠12 小时前
SpringBoot 官网 阅读笔记 启用生产就绪功能 端点
spring boot·笔记·后端
evans在进步13 小时前
HashMap 为什么线程不安全?ConcurrentHashMap 如何解决?
java·spring boot·spring
XS03010617 小时前
Spring AI:两种内置 Advisor 快速实现 RAG
java·人工智能·spring
日月云棠17 小时前
Spring 源码深度剖析:ResourceLoader 的资源加载与路径解析策略
java·后端·spring
小林敲代码778818 小时前
Spring Boot 3 升级踩坑:aj-captcha 行为验证码底图加载失效
java·spring boot·后端
程序员阿明19 小时前
spring boot3访问resources下的文件,使得在浏览器url中可以直接访问
java·spring boot·后端
风起洛阳@不良使19 小时前
Spring MVC的前端控制器配置(servlet+DispatcherServlet)
前端·spring·mvc
霸道流氓气质19 小时前
SpringBoot中使用OAuth2 认证与 JWT Token — 概念、原理与实践
java·spring boot·后端