使用JUnit测试休息服务

时间:2017-01-04 20:21:05

标签: java rest junit jersey

我之前写过另一个question。我在休息服务上执行JUnit测试时遇到错误,因为JSON只是Jersey的字符串。

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的字符串;以这种方式,先前的错误消失了:

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类型的writer,类it.dni.rest.models.DeviceBean和MIME   媒体类型,应用程序/八位字节流,未找到   com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)

所以,我的目标是直接映射JSON中的对象,反之亦然,但Jersey并没有为我做这件事。在Junit测试中,如何使用Jersey启用此映射?

2 个答案:

答案 0 :(得分:2)

很少有库可以帮助单元测试REST Web服务。放心:https://github.com/rest-assured/rest-assured是一个,而Unirest http://unirest.io/是另一个。我刚开始使用Unirest,它非常容易用于JSON。可能值得一看。

答案 1 :(得分:0)

尝试使用Jersey测试进行测试

  

Jersey测试框架起源于用于验证服务器端组件的正确实现的内部工具。   测试RESTful应用程序成为一个更紧迫的问题   "现代"像测试驱动开发和用户开始的方法   寻找可以帮助设计和运行测试的工具   尽可能快,但有许多与测试执行相关的选项   环境。 Jersey Test Framework的当前实现支持   以下功能集:预配置客户端进行访问   部署了多个容器的应用程序支持 - 灰熊,   内存中,jdk,简单,码头能够对抗任何外部   容器自动化可配置流量记录泽西测试框架   主要基于JUnit,但您可以使用TestNG运行测试   好。它几乎可以开箱即用,并且很容易集成它   在基于Maven的项目中。虽然它可用于所有   您可以运行JUnit的环境,我们主要支持   基于Maven的设置。

参考https://jersey.java.net/documentation/latest/test-framework.html