Java 如何断言在void方法中创建的值?
我有课Java 如何断言在void方法中创建的值?,java,junit,mocking,mockito,stubbing,Java,Junit,Mocking,Mockito,Stubbing,我有课 public class CloneUserService { private final UserRepository userRepository; private final PersonRepository personRepository; private final OrderRepository orderRepository; public CloneUserService(UserRepository userRepository,
public class CloneUserService {
private final UserRepository userRepository;
private final PersonRepository personRepository;
private final OrderRepository orderRepository;
public CloneUserService(UserRepository userRepository, PersonRepository personRepository, OrderRepository orderRepository) {
this.userRepository = userRepository;
this.personRepository = personRepository;
this.orderRepository = orderRepository;
}
public void createFromTemplate(String templateUserId) {
User templateUser = userRepository.getUserById(templateUserId);
Person templatePerson = personRepository.getPersonByUserId(templateUserId);
List<Order> templateOrders = orderRepository.getOrdersByUserId(templateUserId);
User newUser = cloneUserFromTemplate(templateUser);
newUser.setId("newId");
userRepository.save(newUser);
Person newPerson = clonePersonFromTemplate(templatePerson);
newPerson.setUser(newUser);
newPerson.setId("newId");
personRepository.save(newPerson);
for (Order templateOrder : templateOrders) {
Order newOrder = cloneOrderFromTemplate(templateOrder);
newOrder.setId("newId");
newOrder.setUSer(newUser);
orderRepository.save(newOrder);
}
}
private Order cloneOrderFromTemplate(Order templateOrder) {
//logic
return null;
}
private Person clonePersonFromTemplate(Person templatePerson) {
//logic
return null;
}
private User cloneUserFromTemplate(User templateUser) {
//logic
return null;
}
}
在你的场景中,我会考虑使用像Mockito这样的嘲讽框架。p> 一些主要优势:
// arrange
Warehouse mock = Mockito.mock(Warehouse.class);
//act
Order order = new Order(TALISKER, 50);
order.fill(warehouse); // fill will call remove() implicitly
// assert
Mockito.verify(warehouse).remove(TALISKER, 50); // verify that remove() method was actually called
您应该研究Mockito之类的模拟框架。如果你走这条路,你不必自己写存根。您只需从Mockito获得一个轻量级mock对象,并验证对其调用了正确的方法。如果您需要检查传入mocked方法的参数是否正确,Mockito有一个名为ArgumentCaptors的东西,可以让您提取参数并对其运行验证。@Jordan我在DB中有一些类似User的实体。我的void方法选择此用户,更改它和一些字段,并将其保存为新用户。我需要比较原始用户(模板用户)和从模板用户创建的新用户。请参阅“我需要比较原始用户(模板用户)和从模板用户创建的新用户。”--要进行良好的单元测试,您应该模拟所有非测试单元的内容。这样就不会有实际的数据库连接。相反,您可以模拟存储库,并指定所需的确切返回值。然后使用ArgumentCaptors验证传递给save方法的数据是否符合您的期望。
// arrange
Warehouse mock = Mockito.mock(Warehouse.class);
//act
Order order = new Order(TALISKER, 50);
order.fill(warehouse); // fill will call remove() implicitly
// assert
Mockito.verify(warehouse).remove(TALISKER, 50); // verify that remove() method was actually called