Spring 引导单元测试断言错误 JSON 对象获得了 JSON 数组
Spring Boot unit testing assertion error JSON object got a JSON array
我正在 spring 启动应用程序中进行单元测试。但是作为对象的getProductById()方法returns可选,我不知道如何测试它。
ProductController.java
@GetMapping("/products/{id}")
@Transactional(readOnly=true)
@Cacheable("product-cache")
public Product getProduct(@PathVariable("id") int id) {
LOGGER.info("Finding product by id : "+id);
return productRepository.findById(id).get();
}
MockTest.java
private static final String PRODUCTS_URL = "/productsapi/products";
private static final int PRODUCT_ID = 1;
private static final String CONTEXT_URL = "/productsapi";
private static final int PRODUCT_PRICE = 1000;
private static final String PRODUCT_DESCRIPTION = "Its awesome";
private static final String PRODUCT_NAME = "Macbook";
@Test
public void testGetProductById() throws JsonProcessingException, Exception {
Product product = buildProduct();
when(productRepository.findById(PRODUCT_ID)).thenReturn(Optional.of(product));
ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
mockMvc.perform(get(PRODUCTS_URL).contextPath(CONTEXT_URL))
.andExpect(status().isOk())
.andExpect(content().json(objectWriter.writeValueAsString(Optional.of(product))));
}
private Product buildProduct() {
Product product = new Product();
product.setId(PRODUCT_ID);
product.setName(PRODUCT_NAME);
product.setDescription(PRODUCT_DESCRIPTION);
product.setPrice(PRODUCT_PRICE);
return product;
}
当我 运行 测试时,它失败并出现以下错误。
错误:
java.lang.AssertionError:
预期:一个 JSON 对象
得到:一个JSON数组
它没有显示任何编译错误。但是测试用例失败。我认为这是将产品对象转换为 json.
的问题
所以,小小帮助解决这个问题会有帮助!!
控制器方法仅返回 Product
对象,它是一个 JSON {}
并且在 andExpect
方法中您使用 JSON 数组断言[{}]
,删除 Optional
并仅传递产品对象
mockMvc.perform(get(PRODUCTS_URL).contextPath(CONTEXT_URL)).andExpect(status().isOk())
.andExpect(content().json(objectWriter.writeValueAsString(product)));
我正在 spring 启动应用程序中进行单元测试。但是作为对象的getProductById()方法returns可选,我不知道如何测试它。
ProductController.java
@GetMapping("/products/{id}")
@Transactional(readOnly=true)
@Cacheable("product-cache")
public Product getProduct(@PathVariable("id") int id) {
LOGGER.info("Finding product by id : "+id);
return productRepository.findById(id).get();
}
MockTest.java
private static final String PRODUCTS_URL = "/productsapi/products";
private static final int PRODUCT_ID = 1;
private static final String CONTEXT_URL = "/productsapi";
private static final int PRODUCT_PRICE = 1000;
private static final String PRODUCT_DESCRIPTION = "Its awesome";
private static final String PRODUCT_NAME = "Macbook";
@Test
public void testGetProductById() throws JsonProcessingException, Exception {
Product product = buildProduct();
when(productRepository.findById(PRODUCT_ID)).thenReturn(Optional.of(product));
ObjectWriter objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
mockMvc.perform(get(PRODUCTS_URL).contextPath(CONTEXT_URL))
.andExpect(status().isOk())
.andExpect(content().json(objectWriter.writeValueAsString(Optional.of(product))));
}
private Product buildProduct() {
Product product = new Product();
product.setId(PRODUCT_ID);
product.setName(PRODUCT_NAME);
product.setDescription(PRODUCT_DESCRIPTION);
product.setPrice(PRODUCT_PRICE);
return product;
}
当我 运行 测试时,它失败并出现以下错误。
错误: java.lang.AssertionError: 预期:一个 JSON 对象 得到:一个JSON数组
它没有显示任何编译错误。但是测试用例失败。我认为这是将产品对象转换为 json.
的问题所以,小小帮助解决这个问题会有帮助!!
控制器方法仅返回 Product
对象,它是一个 JSON {}
并且在 andExpect
方法中您使用 JSON 数组断言[{}]
,删除 Optional
并仅传递产品对象
mockMvc.perform(get(PRODUCTS_URL).contextPath(CONTEXT_URL)).andExpect(status().isOk())
.andExpect(content().json(objectWriter.writeValueAsString(product)));