JUnit5仅导入指定Bean未加载全上下文,测试遇NullPointerException
问题描述
项目中有如下配置类:
@Configuration public class MyConfiguration { //client SDK configuration build @Bean public MyBean myBean() { return new MyBean(); } }
想要在单元测试中使用该Bean且不加载完整应用上下文,编写了测试类:
@ExtendWith(MockitoExtension.class) @ContextConfiguration(classes = {MyConfiguration.class}) public class Test { @Autowired private MyBean mybean; @Test public void methodTest() { //use mybean class methods mybean.method(); } }
运行测试时,调用mybean.method()抛出了NullPointerException,请问原因是什么?
问题原因及解决办法
核心原因:使用了错误的测试扩展类
MockitoExtension是Mockito框架提供的扩展,仅用于支持Mockito的模拟对象功能,完全不具备解析Spring的@ContextConfiguration和@Autowired注解的能力。因此你的mybean变量根本不会被Spring容器注入,始终为null,调用方法自然抛出空指针异常。解决办法是替换为Spring官方提供的
SpringExtension,它负责加载Spring轻量上下文并处理依赖注入:@ExtendWith(SpringExtension.class) @ContextConfiguration(classes = {MyConfiguration.class}) public class Test { @Autowired private MyBean mybean; @Test public void methodTest() { mybean.method(); } }如果你用的是Spring Boot项目,也可以直接使用
@SpringBootTest并指定classes参数来限定加载的配置类,不过@ExtendWith(SpringExtension.class)+@ContextConfiguration是更轻量的方式。潜在的Bean匹配问题
Spring中@Bean默认的Bean名称是方法名(即配置类里的myBean),而你测试类中注入的变量名是mybean(小写b)。如果后续项目中出现多个MyBean类型的Bean,按名称注入时会匹配失败,也可能导致空指针。可以通过以下方式避免:- 将测试类中的变量名改为
myBean,与Bean名称保持一致; - 在
@Bean注解中显式指定名称,比如@Bean(name = "mybean"); - 使用
@Qualifier("myBean")配合@Autowired指定要注入的Bean名称:@Autowired @Qualifier("myBean") private MyBean mybean;
- 将测试类中的变量名改为
内容的提问来源于stack exchange,提问作者Lucho82
相关产品推荐
相关产品推荐

