Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何断言在void方法中创建的值?_Java_Junit_Mocking_Mockito_Stubbing - Fatal编程技术网

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> 一些主要优势:

  • 向存储库接口添加新方法不需要在存根中实现它
  • 支持准确的验证次数和至少一次验证
  • 允许按顺序进行灵活的验证(例如:按顺序验证所需内容,而不是每次交互)
  • 非常好且简单的注释语法-@Mock、@InjectMocks、@Spy
  • 下面是一个例子——也许你会感兴趣:

    // 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