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

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不匹配。

具体修复步骤:

  1. 修正mock的save方法行为:让它返回传入的Order参数,而不是新的空对象。这样就能保证返回的是service中已经设置好属性的Order。
  2. 移除冗余代码:删除测试方法中重复调用的MockitoAnnotations.openMocks(this)(@BeforeEach已经初始化过mock)。
  3. 清理无用依赖:移除测试类中未使用的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:40:58