Junit5 Jupiter环境下@Autowired注解失效无法注入依赖问题求助
问题核心原因
- 同时混用
MockitoExtension和SpringExtension,且@InjectMocks不会将Spring容器中注入的formatBO注入到自己实例化的DetailsServiceImpl对象中,仅会注入Mockito管理的mock/spy对象 - JUnit5不需要加
@RunWith(JUnitPlatform.class)注解,该注解是JUnit4适配JUnit5平台的过渡注解,会导致扩展加载冲突 - 你手动实例化了
DetailsServiceImpl service = new DetailsServiceImpl(),该对象不受Spring容器管理,所以Spring不会自动注入它内部的formatBO属性
注意:你当前测试方法中调用的
service.fetchBasicDetails(bean)和你提供的Service类中实际存在的fetchChargeDetails方法名不一致,请检查是否为笔误,避免出现方法不存在的报错。
解决方案1:基于Spring测试上下文(保留@Autowired能力)
直接把测试类改成完全受Spring管理,去掉MockitoExtension的混用,代码修改如下:
// 只保留SpringExtension,JUnit5不需要@RunWith @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = {FormatBO.class, Mapper.class, DetailsServiceImpl.class}) public class SimpleImplTest { @MockBean Mapper mapper; @Autowired FormatBO formatBO; // 直接从Spring容器注入Service,不要自己new @Autowired private DetailsServiceImpl service; TestBean bean; @BeforeEach public void initData() { bean = new TestBean(); bean.setCategoryId("1"); } @Test public void getBasicDetailsTest(){ // 补全你需要的测试逻辑和断言即可 service.fetchChargeDetails(bean); } }
修改后Spring容器会自动注入DetailsServiceImpl内部的formatBO,不会再出现空指针。
解决方案2:纯Mockito实现(不需要启动Spring上下文,执行更快)
如果不需要依赖Spring容器的其他能力,可以完全用Mockito做注入,不需要SpringExtension,修改如下:
// 只保留MockitoExtension @ExtendWith(MockitoExtension.class) public class SimpleImplTest { // 把Mapper改成@Mock即可 @Mock Mapper mapper; // 要注入到service里的真实对象用@Spy修饰 @Spy FormatBO formatBO = new FormatBO(); @InjectMocks private DetailsServiceImpl service; TestBean bean; @BeforeEach public void initData() { bean = new TestBean(); bean.setCategoryId("1"); } @Test public void getBasicDetailsTest(){ // 补全你需要的测试逻辑和断言即可 service.fetchChargeDetails(bean); } }
这种方案不需要启动Spring上下文,测试执行速度更快,适合单测仅验证Service逻辑的场景。
内容的提问来源于stack exchange,提问作者Chethan
相关产品推荐
相关产品推荐

