[英]Testing a rest service with JUnit
我以前写过另一个问题 。 在REST服务上执行JUnit测试时出现错误,因为JSON只是Jersey的String。
public class MachineResponseTest {
private static final String BASE_URI = "http://localhost:8080/dni-fe/home"
@Test
public void testDevice() {
WebResource resource = Client.create().resource(BASE_URI);
resource.accept(MediaType.APPLICATION_JSON);
StringBuilder sb = new StringBuilder();
sb.append("{\"name\":\"123456\",\n");
sb.append(" \"country\":\"Spain\",\n");
sb.append(" \"company\":\"xxx\",\n");
sb.append(" \"model\":\"1.10.0\"\n}");
MachineResponse result = resource.post(MachineResponse.class,sb.toString());
}
然后,我尝试将StringBuilder转换为org.codehaus.jettison.json.JSONObject
对象,并返回一个由POJO插入的String。 这样,先前的错误消失了:
try{
StringBuilder sb = new StringBuilder();
sb.append("{\"name\":\"123456\",\n");
sb.append(" \"country\":\"Spain\",\n");
sb.append(" \"company\":\"xxx\",\n");
sb.append(" \"model\":\"1.10.0\"\n}");
JSONObject jsonObj = new JSONObject(sb.toString());
}
catch(JSONException e){
....
}
String result = resource.post(String.class,jsonObj);
例如,假设我有这个POJO类:
public class ItemBean implements Serializable {
private static final long serialVersionUID = 7438046484680798158L;
private String name;
private String country;
private String company;
private String model;
public ItemBean() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
我尝试使用此POJO来构建测试,例如:
ItemBean item = new ItemBean();
item.setName("123456");
item.setCountry("Spain");
item.setCompany("xxxx");
item.setModel("1.10.0");
String result = resource.post(String.class,item);
但是测试以错误结束:
com.sun.jersey.api.client.ClientHandlerException:com.sun.jersey.api.client.ClientHandlerException:Java类型的消息正文编写器,类为it.dni.rest.models.DeviceBean,MIME媒体类型为application /在com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)上找不到八位字节流
因此,我的目标是直接在JSON中映射对象,反之亦然,但是Jersey并没有为我做这件事。 如何在Junit测试中使用Jersey启用此映射?
很少有真正有助于单元测试REST Web服务的库。 保证放心: https : //github.com/rest-assured/rest-assured是一个,Unirest http://unirest.io/是另一个。 我刚开始使用Unirest,它对于JSON来说非常容易使用。 可能值得一看。
尝试Jersey测试进行测试
Jersey Test Framework最初是一种内部工具,用于验证服务器端组件的正确实现。 使用“现代”方法(如测试驱动的开发)来测试RESTful应用程序成为一个更加紧迫的问题,用户开始寻找一种工具,该工具可以帮助尽快设计和运行测试,但提供了许多与测试执行环境相关的选项。 Jersey Test Framework的当前实现支持以下功能集:预配置的客户端,以访问对多个容器的已部署应用程序支持-灰熊,内存中,jdk,简单,码头能够针对任何外部容器自动配置的流量日志记录而运行框架主要基于JUnit,但是您也可以使用TestNG运行测试。 它几乎可以直接使用,并且可以很容易地将其集成到基于Maven的项目中。 尽管它可以在可以运行JUnit的所有环境中使用,但我们主要支持基于Maven的设置。
请参阅https://jersey.java.net/documentation/latest/test-framework.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.