You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,按名称注入时会匹配失败,也可能导致空指针。可以通过以下方式避免:

    1. 将测试类中的变量名改为myBean,与Bean名称保持一致;
    2. 在@Bean注解中显式指定名称,比如@Bean(name = "mybean");
    3. 使用@Qualifier("myBean")配合@Autowired指定要注入的Bean名称:
      @Autowired
      @Qualifier("myBean")
      private MyBean mybean;
      

内容的提问来源于stack exchange,提问作者Lucho82

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:44:50