返回Java 8 Optional的Mocking对象,带有Mockito的对象返回Empty Optional

Amy*_*hir 5 java mocking mockito optional java-8

我试图模拟一个对象,该对象使用Mockito返回一个Java Optional对象:

SomeObject someObject = new SomeObject();
Mockito.when(someSpringJpaRepository.findById(Mockito.any(UUID.class))).thenReturn(Optional.of(someObject));
Run Code Online (Sandbox Code Playgroud)

someSpringJpaRepository.findById(UUID)被调用时,它返回Optional.empty

我期望该方法findById()返回someObject
为什么要返回Optional.empty呢?

方法如下:

public UUID saveOrder(OrderDTO orderDto) {

        Order order = new Order();
        if (orderDto.getId() != null) {
            Optional<Order> result = orderRepository.findById(orderDto.getId());
            if (result != null && result.isPresent()) {
                order = result.get(); // existing record

            } else {
                order.setId(UUID.randomUUID());
            }
        } else {
            // new record
            order.setId(UUID.randomUUID());
        }

        return order.getId();
    }
Run Code Online (Sandbox Code Playgroud)

这是Junit:

@Test
    public void saveOrderTest(){

        @Autowired
        private OrderApiService orderApiService;
        @Mock
        private OrderRepository orderRepository;

        OrderDTO orderDto = new OrderDTO();
        UUID orderID = UUID.randomUUID();
        Order order = new Order();
        order.setId(orderID);

        orderDto.setId(orderID);
        Mockito.when(orderRepository.findById(Mockito.any(UUID.class))).thenReturn(Optional.of(order));
        assertNotNull(orderApiService.saveOrder(orderDto));
    }

Run Code Online (Sandbox Code Playgroud)

Bye*_*Bye 4

@Mock在课堂上什么也没做。您创建了一个单独的实例,orderRepository该实例未注入到您的服务类中。将您的模拟注入上下文使用@MockBean

@Mock这里的区别@MockBean