模拟 returns Java 8 可选对象与 Mockito returns 空可选
Mocking Object that returns Java 8 Optional Object with Mockito returns Empty Optional
我正在尝试使用 Mockito 模拟一个 return 是 Java 可选对象的对象:
SomeObject someObject = new SomeObject();
Mockito.when(someSpringJpaRepository.findById(Mockito.any(UUID.class))).thenReturn(Optional.of(someObject));
当 someSpringJpaRepository.findById(UUID)
被调用时,它 returns Optional.empty
.
我期待方法 findById()
到 return someObject
。
为什么它 returning 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();
}
这是 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));
}
你可以尝试使用间谍方法
Repository spyRepo = Mockito.spy(someSpringJpaRepository);
Mockito.doReturn(Optional.of(someObject)).when(spyRepo).findById(Mockito.any(UUID.class));
您在 class 中的 @Mock
什么也没做。您创建了一个单独的 orderRepository
实例,它没有注入到您的服务 class 中。要将模拟注入上下文,请使用 @MockBean
@Mock
和 @MockBean
之间的差异
我正在尝试使用 Mockito 模拟一个 return 是 Java 可选对象的对象:
SomeObject someObject = new SomeObject();
Mockito.when(someSpringJpaRepository.findById(Mockito.any(UUID.class))).thenReturn(Optional.of(someObject));
当 someSpringJpaRepository.findById(UUID)
被调用时,它 returns Optional.empty
.
我期待方法 findById()
到 return someObject
。
为什么它 returning 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();
}
这是 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));
}
你可以尝试使用间谍方法
Repository spyRepo = Mockito.spy(someSpringJpaRepository);
Mockito.doReturn(Optional.of(someObject)).when(spyRepo).findById(Mockito.any(UUID.class));
您在 class 中的 @Mock
什么也没做。您创建了一个单独的 orderRepository
实例,它没有注入到您的服务 class 中。要将模拟注入上下文,请使用 @MockBean
@Mock
和 @MockBean
之间的差异