Spring Boot REST API 单元测试执行中的空页面对象
Null Page object in Spring Boot REST API unit test execution
我有以下 REST API 控制器 class。
端点检索客户的分页列表。
@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方法中添加的class,然后在测试方法的下面一行
when(mockedCustomerRepository.findAll(customersPageable)).thenReturn(customersList);
替换
when(mockedCustomerRepository.findAll(customersPageable)).thenReturn(customersList);
和
when(mockedCustomerRepository.findAll(any(Pageable.class))).thenReturn(customersList);
您目前拥有的是模拟存储库 return 只有当它接收到准确的 customersPageable(为空)时才会产生结果。
如果提及的任何对象 class 将作为参数传递
,则使用 any() 将 return 预期结果
我有以下 REST API 控制器 class。
端点检索客户的分页列表。
@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方法中添加的class,然后在测试方法的下面一行
when(mockedCustomerRepository.findAll(customersPageable)).thenReturn(customersList);
替换
when(mockedCustomerRepository.findAll(customersPageable)).thenReturn(customersList);
和
when(mockedCustomerRepository.findAll(any(Pageable.class))).thenReturn(customersList);
您目前拥有的是模拟存储库 return 只有当它接收到准确的 customersPageable(为空)时才会产生结果。
如果提及的任何对象 class 将作为参数传递