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

使用MockBean模拟SessionFactory时出现空指针异常问题求助

问题原因

你遇到的空指针异常,核心原因是Spring的@MockBean和Mockito的MockitoAnnotations.initMocks(this)初始化时机冲突,导致执行Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session)时,sessionFactory还未被正确注入,处于null状态。另外如果你的项目是普通Spring项目(非Spring Boot),@MockBean注解本身可能无法生效——它属于Spring Boot测试专属注解。

解决方案

方案1:纯Mockito测试(无需Spring上下文)

如果不需要加载Spring容器,直接用Mockito模拟依赖并手动注入DAO:

public class MyDAOImplTest {

    @Mock
    private Session session;

    @Mock
    private Criteria criteria;

    @Mock
    private SessionFactory sessionFactory;

    private MyDAOImpl myDaoImpl;

    @BeforeMethod
    public void setup(){
        MockitoAnnotations.initMocks(this);
        // 配置SessionFactory的Mock行为
        Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
        // 匹配DAO中创建Criteria的逻辑
        Mockito.when(session.createCriteria(ArchiveItem.class)).thenReturn(criteria);
        // 手动注入依赖到DAO
        myDaoImpl = new MyDAOImpl();
        myDaoImpl.setSessionFactory(sessionFactory); // 假设DAO提供了setter方法
    }

    @Test
    public void contextLoad(){
        System.out.println("Context Loads");
    }
}

方案2:Spring Boot项目+@MockBean

如果是Spring Boot项目,用@MockBean替换容器中的SessionFactory,Spring会自动完成Mock实例的初始化,无需手动调用MockitoAnnotations.initMocks:

@SpringBootTest // 替换原@ContextConfiguration,自动加载Spring Boot上下文
public class MyDAOImplTest extends AbstractTestNGSpringContextTests {

    @Mock
    private Session session;

    @Mock
    private Criteria criteria;

    @MockBean
    private SessionFactory sessionFactory;

    @Autowired
    private MyDAOImpl myDaoImpl;

    @BeforeMethod
    public void setup(){
        // sessionFactory已被Spring注入为Mock实例,直接配置行为
        Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
        Mockito.when(session.createCriteria(ArchiveItem.class)).thenReturn(criteria);
    }

    @Test
    public void contextLoad(){
        System.out.println("Context Loads");
    }
}

方案3:普通Spring项目(非Spring Boot)

使用Mockito的@Mock+@InjectMocks,配合Spring测试监听器自动初始化Mocks:

@ContextConfiguration(locations="classpath:test-context.xml")
// 添加Mockito监听器,自动处理@Mock和@InjectMocks的初始化
@TestExecutionListeners(listeners = {MockitoTestExecutionListener.class, DependencyInjectionTestExecutionListener.class})
public class MyDAOImplTest extends AbstractTestNGSpringContextTests {

    @Mock
    private Session session;

    @Mock
    private Criteria criteria;

    @Mock
    private SessionFactory sessionFactory;

    @InjectMocks // 自动将@Mock依赖注入到DAO实例
    @Autowired
    private MyDAOImpl myDaoImpl;

    @BeforeMethod
    public void setup(){
        Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
        Mockito.when(session.createCriteria(ArchiveItem.class)).thenReturn(criteria);
    }

    @Test
    public void contextLoad(){
        System.out.println("Context Loads");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:55:08