【问题标题】:Testing a rest service with JUnit使用 JUnit 测试休息服务
【发布时间】:2017-01-04 20:21:05
【问题描述】:

我之前写过另一个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 类型、it.dni.rest.models.DeviceBean 类和 MIME 的编写器 媒体类型 application/octet-stream 未在 com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)

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

【问题讨论】:

  • 你的例子没有多大意义:你在最后一个代码示例中引用的resource仅在测试类的方法testDevice中实例化,实际上并没有断言或验证任何事物?请将您的问题修改为minimal complete and verifiable example。
  • 好的,但是如果我的测试出错,我什么也做不了。

标签: java rest junit jersey


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试 Jersey Test 进行测试

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-01
      • 2023-03-28
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多