OrderService单元测试遇NullPointerException:orderRepository为空求助
问题根源
这个空指针异常的核心原因是:你的OrderService实例中的orderRepository依赖未被正确初始化(注入或Mock),导致调用save方法时触发空指针。
解决方案
根据单元测试的两种常见场景,分别给出修复方案:
场景1:Spring Boot集成测试(启动Spring容器)
如果你的测试需要依赖Spring上下文(比如需要其他Bean协同),可以通过@MockBean自动注入Mock的Repository:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import static org.mockito.Mockito.when; @SpringBootTest public class OrderServiceTest { @Autowired private OrderService orderService; @MockBean private OrderRepository orderRepository; @Test void testSaveOrder() { // 构建测试订单数据 Order testOrder = new Order(); // 填充订单、购物车项、商品等测试属性... // Mock Repository的save行为 when(orderRepository.save(testOrder)).thenReturn(testOrder); // 执行Service方法 Order result = orderService.saveOrder(testOrder); // 断言结果或验证调用 // 示例:assertThat(result.getId()).isEqualTo(testOrder.getId()); } }
场景2:纯Mockito单元测试(不启动Spring容器)
如果只是单独测试Service的业务逻辑,用纯Mockito即可完成依赖注入:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class OrderServiceTest { @InjectMocks private OrderServiceImpl orderService; // 注意使用Service实现类 @Mock private OrderRepository orderRepository; @Test void testSaveOrder() { Order testOrder = new Order(); // 构建测试数据... when(orderRepository.save(testOrder)).thenReturn(testOrder); Order savedOrder = orderService.saveOrder(testOrder); // 验证Repository方法调用或断言结果 // verify(orderRepository, times(1)).save(testOrder); } }
关键检查点
- 确认
OrderService实现类中,orderRepository是通过构造函数注入(推荐)或@Autowired注入的,避免手动new实例导致依赖缺失 - 检查测试类中是否错误地直接
new OrderService(),这种写法不会自动注入Repository,必然触发空指针
内容的提问来源于stack exchange,提问作者Dadinho2000
相关产品推荐
相关产品推荐

