Spring Boot Testcontainers测试中如何注入Mock的MyService解决依赖为null问题
依赖注入失效核心根因
90%的场景下,@Autowired字段出现null的原因只有两个:
- 目标类实例并非由Spring容器管理(比如测试代码里手动new出来的MyOtherClass),类上的注入注解完全不会被容器解析
- 测试类没有正确关联Spring上下文,没有完成Bean的注册和注入流程
注意:你贴的代码里存在变量名不匹配的笔误:类中声明注入的是
myService,调用时写的是keyService.getKey(),需要核对统一变量名,否则会直接触发编译错误。
Testcontainers测试环境下的MyService Mock注入实现
你当前的测试类已经配置了@SpringBootTest+@Testcontainers,本身已经加载完整Spring上下文、启动对应依赖容器,不需要修改Testcontainers的任何配置,按以下步骤操作即可:
- 确认测试依赖
确保引入了Spring Boot Test原生依赖spring-boot-starter-test,该依赖内置了Mockito、@MockBean能力,无需额外引入第三方包。 - 注册Mock Bean替换原有真实实例
直接在测试类中添加Mock声明,Spring会自动将上下文中原有的真实MyService Bean替换为Mock实例,完全不影响Testcontainers启动的数据库、中间件等容器服务:// 直接加在MyTest类的字段声明位置即可 @MockBean private MyService myService; - 从容器获取待测试类实例,不要手动new
在测试类中直接注入已经被容器管理的MyOtherClass实例,不要在测试方法里手动创建对象:@Autowired private MyOtherClass myOtherClass; - 配置Mock方法返回值
在测试方法中给Mock的getKey()方法设置预期返回值,避免空指针:@Test public void myTest() { // 设定MyService.getKey()方法的返回值 when(myService.getKey()).thenReturn(123); // 直接调用待测试方法,此时MyOtherClass中的myService已经被正确注入 KeyValue<Object, Object> result = myOtherClass.doSomething("testKey", "testValue"); // 编写对应断言逻辑即可 }
常见踩坑点
- 绝对不要在测试代码里手动
new MyOtherClass():这种手动创建的实例完全脱离Spring容器,哪怕容器中Mock Bean配置得再正确,实例内的注入字段永远是null - 如果只需要测试MyOtherClass的单类逻辑、不需要启动Testcontainers和完整Spring上下文,可以切换为纯Mockito测试方案:用
@ExtendWith(MockitoExtension.class)标记测试类,用@InjectMocks注解标记手动创建的MyOtherClass实例,配合@Mock声明MyService即可完成注入,这种方式测试启动速度更快,但和Testcontainers环境相互独立
内容的提问来源于stack exchange,提问作者dorcsi
相关产品推荐
相关产品推荐

