使用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
相关产品推荐
相关产品推荐

