spring-boot中测试restful接口非常方便,通过使用@SpringBootTest、@RunWith两个注解及TestRestTemplate 就可以快速的实现。
1.编写BaseTest
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class BaseTest {
public static final Logger logger= LoggerFactory.getLogger(BaseTest.class);
@Autowired
protected TestRestTemplate template;
protected URL base;
//
@LocalServerPort
protected int port;
protected HttpHeaders httpHeaders=new HttpHeaders();
protected String token="10544addb5854f76993d7b6e07ffbc0c";
protected Map<String,Object> queryParams=new HashMap<>();
public BaseTest() {
}
@Before
public void before() throws MalformedURLException {
queryParams.put("token",token);
// 验证 token 是否有效
String url=String.format("http://localhost:%d/spring-boot-demo/",port);
this.base=new URL(url);
httpHeaders.set("token",token);
}
protected UriComponentsBuilder uriComponentsBuilder(String urlPath,Map<String,Object> queryParamMap) {
StringBuilder urlBuilder=new StringBuilder(base.toString());
urlBuilder.append(urlPath);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(urlBuilder.toString());
if (queryParamMap!= null && !queryParamMap.isEmpty()) {
queryParamMap.entrySet().stream().forEach(entry -> {
builder.queryParam(entry.getKey(), entry.getValue());
});
}
return builder;
}
protected <T> void test(UriComponentsBuilder builder, HttpMethod httpMethod, T body, Logger logger) {
HttpEntity httpEntity=null;
if (body!= null) {
httpEntity = new HttpEntity(body,httpHeaders);
}else {
httpEntity = new HttpEntity(httpHeaders);
}
ResponseEntity<WebResponseResult> responseEntity=template.exchange(builder.build().encode().toUri(), httpMethod,httpEntity,WebResponseResult.class);
WebResponseResult webResponseResult=responseEntity.getBody();
Assert.assertEquals(200,webResponseResult.getMessage().getCode());
logger.info("resposne data is "+JSON.toJSONString(webResponseResult));
}
}
2.编写用户测试类
public class UserControllerTests extends BaseTest{
public static final Logger logger= LoggerFactory.getLogger(UserControllerTests.class);
@Test
public void findUserDetailByUserName() throws URISyntaxException {
UriComponentsBuilder builder = uriComponentsBuilder("users/detail",new HashMap<>());
test(builder,HttpMethod.GET,null,logger);
}
}
运行测试用例