OrderService创建订单Mock测试失败:User对象为Null问题求助
问题分析与解决方案
错误Expected :Mock for User, hashCode: 1835841364 Actual :null的核心原因是:你在测试中mock的orderRepository.save()方法返回了一个空的Order对象,而不是OrderService.create()方法中已经设置了user和product的那个Order实例。
当OrderService执行return or.save(newOrder);时,由于mock的save方法返回的是你提前创建的空mockOrder,这个对象里的user和product都是null,自然和测试预期的mockUser、product不匹配。
具体修复步骤:
- 修正mock的save方法行为:让它返回传入的Order参数,而不是新的空对象。这样就能保证返回的是service中已经设置好属性的Order。
- 移除冗余代码:删除测试方法中重复调用的
MockitoAnnotations.openMocks(this)(@BeforeEach已经初始化过mock)。 - 清理无用依赖:移除测试类中未使用的
ProductService和ProductRepository注入,避免干扰。
修改后的测试代码:
public class OrderServiceTest { @InjectMocks private OrderService orderService; @Mock private OrderRepository orderRepository; @BeforeEach public void setUp() { MockitoAnnotations.openMocks(this); } @Test public void testCreateOrder() { Product product = new Product(); product.setProductName("productName_0"); product.setProductSalePrice(1290.78); User mockUser = Mockito.mock(User.class); // 让save方法返回传入的参数,而不是空对象 when(orderRepository.save(any(Order.class))).thenAnswer(invocation -> invocation.getArgument(0)); Order createdOrder = orderService.create(mockUser, product); assertNotNull(createdOrder); assertEquals(mockUser, createdOrder.getUser()); assertEquals(product, createdOrder.getProduct()); verify(orderRepository, times(1)).save(any(Order.class)); } }
额外说明:
如果你坚持要使用提前创建的mockOrder,也可以在返回前给它设置对应的user和product,但这种方式不够灵活,不如直接返回传入的参数更贴合真实业务逻辑:
Order mockOrder = new Order(); mockOrder.setUser(mockUser); mockOrder.setProduct(product); when(orderRepository.save(any(Order.class))).thenReturn(mockOrder);
但第一种方式(返回传入参数)更推荐,因为它能准确反映OrderService中对Order对象的属性设置操作,不需要在测试中重复设置属性。
内容的提问来源于stack exchange,提问作者user22566443
相关产品推荐
相关产品推荐

