【问题标题】:Null Page object in Spring Boot REST API unit test executionSpring Boot REST API 单元测试执行中的 Null Page 对象
【发布时间】:2021-05-19 18:45:03
【问题描述】:

我有以下 REST API 控制器类。

端点检索客户的分页列表。

@RestController
public class CustomerController {
    
    @Autowired
    private CustomerRepository customerRepository;
    
    public void setCustomerRepositoryMock(CustomerRepository mockedCustomerRepository) {
        this.customerRepository = mockedCustomerRepository;
    }

    @GetMapping(value="/customers", produces = "application/json")
    public ResponseEntity<Page<Customer>> customersList(
        @RequestParam(value="pageNumber") int pageNumber,
        @RequestParam(value="pageSize") int pageSize){
        
        Pageable customersPageable = PageRequest.of(pageNumber, pageSize);
        
        Page<Customer> customersList = customerRepository.findAll(customersPageable);
        
        return new ResponseEntity<Page<Customer>>(customersList, HttpStatus.OK);
    }
}

现在我想为该方法创建一个模拟单元测试。

这就是我所拥有的。

public class CustomerControllerTest {
    
    private CustomerRepository mockedCustomerRepository;
    private CustomerController customerController;
    private Customer customer;
    private Page<Customer> customersList;
    Pageable customersPageable;
    
    @BeforeEach
    void setup() {
    
        customer = new Customer();
        customer.setName("Pete");
        customer.setAge(35);
        customer.setEmail("pete@test.com");
        
        List<Customer> customersListTest = new ArrayList<Customer>();
        customersListTest.add(customer);    
        
        customersList = new PageImpl<>(customersListTest);
                
        mockedCustomerRepository = mock(CustomerRepository.class);
                
        customerController = new CustomerController();
        customerController.setCustomerRepositoryMock(mockedCustomerRepository);
        
    }
    
    @Test
    void testListCustomers() {

        when(mockedCustomerRepository.findAll(customersPageable)).thenReturn(customersList);    

        ResponseEntity<Page<Customer>> respPageCustomers = customerController.customersList(0, 3);
    
        assertTrue(respPageCustomers.getBody() != null);
        
    }
}

问题是当执行以下行时(在 API 方法中),CustomerList 为空。

Page<Customer> customersList = customerRepository.findAll(customersPageable);

但它应该有内容,因为内容是在测试类的setup方法中添加的,然后在测试方法的下一行中。

when(mockedCustomerRepository.findAll(customersPageable)).thenReturn(customersList);

【问题讨论】:

    标签: java spring-boot junit mockito spring-data


    【解决方案1】:

    替换

    when(mockedCustomerRepository.findAll(customersPageable)).thenReturn(customersList);
    

    when(mockedCustomerRepository.findAll(any(Pageable.class))).thenReturn(customersList);
    

    您目前拥有的是 - 模拟存储库仅在收到确切的 customersPageable(为空)时才会返回结果。
    如果提到的类的任何对象将作为参数传递,则使用 any() 将返回预期结果

    【讨论】:

    • 完美!就是这样。刚刚接受了答案。非常感谢。
    猜你喜欢
    • 2023-03-25
    • 2018-12-18
    • 2020-08-08
    • 2018-03-19
    • 2017-04-23
    • 2019-02-07
    • 2018-11-09
    • 2018-06-15
    • 2022-07-31
    相关资源
    最近更新 更多