为什么要求对Web服务的API进行测试?请移步这里Java中几种Unit Test场景
假设:我们需要需要对前端提供一个API,这个API的功能是:通过结果关键字查询产品的描述信息;
目录:
1,建立API契约
2, API代码
3, 测试代码:测试参数,测试找到资源情况下的返回结果,测试未找到资源是的返回结果
建立API的契约:
建议使用Swagger 的yaml格式来定义,这里为了易读,使用纯中文描述.
GET请求
http://localhost:8888/api/products/{productId}
查询参数:
countryCode: String
返回结果:
200: 找到了相关资源
{
"name" : "ABC",
"countryCode" : "US",
"description" : "Super ABC"
}
404: 未找到资源
{
"message": "Not found."
}
API代码
ProductResource
@RestController
@RequestMapping("/api/products")
public class ProductResource {
@Autowired
private ProductService productService;
@GetMapping("/{productId}
public Product query(@PathVariable("productId") String productId,
@RequestParam("countryCode") String countryCode) thrown NotFoundException {
productService.query(productId, countryCode);
}
}
ProductService
@Service
public class ProductService {
public ProductDTO query(String productId, String countryCode) throws NotFoundException {
if ("ABC".equals(productId) && "US".equals(countryCode)) {
return new ProductDTO("ABC", "US", "Super ABC");
}
throw new NotFoundException("Not found");
}
}
ProductDTO
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductDTO {
private String name;
private String countryCode;
private String description;
}
测试代码
测试参数:should_response_4XX_when_country_code_is_empty()
测试找到资源情况下的返回结果:should_response_expected_product_information_when_find_product_by_product_id_and_country_code()
测试未找到资源是的返回结果:should_response_404_when_product_not_found_by_produt_id_and_country_code()
@RunWith(SpringRunner.class)
@SpringBootTest(class=Application.class)
public class ProductResourceTest {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
protected MockMvc mockMvc;
@Autowired
private ProductResource productResource;
@Autowired
private ProductService productService;
@Autowired
private GlobalEntityExceptionHandler globalEntityExceptionHandler;
@BeforeClass
public static void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(productResource)
.setControllerAdvice(globalEntityExceptionHandler)
.build();
}
@Test
public void should_response_4XX_when_country_code_is_empty() {
mockMvc.perform(
get("/api/products/ABC")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().is4xxClientError());
}
@Test
public void should_response_expected_product_information_when_find_product_by_product_id_and_country_code() {
String expectedResult = OBJECT_MAPPER.writeValueAsString(ProductDTO.builder()
.name("ABC")
.countryCode("US");
.description("Super ABC")
.build());
mockMvc.perform(
get("/api/products/ABC")
.contentType(MediaType.APPLICATION_JSON)
.param("countryCode", "US"))
.andExpect(status().isOk())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(content().String(expectedResult));
}
@Test
public void should_response_404_when_product_not_found_by_produt_id_and_country_code() {
String expectedResult = "{\"message\":\"\"}";
mockMvc.perform(
get("/api/products/AAA")
.contentType(MediaType.APPLICATION_JSON)
.param("countryCode", "GB"))
.andExpect(status().isNotFound())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(content().String(expectedResult));
}
}
网友评论