如何使用JerseyTest Framework

时间:2015-10-18 18:49:33

标签: json jersey testng jersey-client jersey-test-framework

我正在尝试编写一个简单的测试类,它模拟通过POST方法创建客户的RESTful Web服务。以下assertEquals失败,我收到400 Bad Request回复。我无法使用调试器来观察堆栈跟踪。然而,控制台告诉我以下......

信息:已启动侦听器绑定到[localhost:9998]
信息:[HttpServer]已开始。

public class SimpleTest extends JerseyTestNg.ContainerPerMethodTest {

    public class Customer {
        public Customer() {}

        public Customer(String name, int id) {
            this.name = name;
            this.id = id;
        }

        @JsonProperty("name")
        private String name;

        @JsonProperty("id")
        private int id;
    }

    @Override
    protected Application configure() {
        return new ResourceConfig(MyService.class);
    }

    @Path("hello")
    public static class MyService {
        @POST
        @Consumes(MediaType.APPLICATION_JSON)
        public final Response createCustomer(Customer customer) {
            System.out.println("Customer data: " + customer.toString());
            return Response.ok("customer created").build();
        }
    }

    @Test
    private void test() {
        String json =   "{" +
                "\"name\": \"bill\", " +
                "\"id\": 4" +
                "}";
        final Response response = target("hello").request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(json));
        System.out.println(response.toString());
        assertEquals(response.getStatus(), 200);
    }
}

1 个答案:

答案 0 :(得分:4)

您可以使用response.toString()阅读实际正文,而不是打印response.readEntity(String.class)。您将在身体中找到的是杰克逊的错误消息

  

找不到类型[simple type,class simple.SimpleTest $ Customer]的合​​适构造函数:无法从JSON对象实例化(需要添加/启用类型信息?)

乍一看,Customer课程看起来不错;它有一个默认的构造函数。但真正的问题是杰克逊无法实例化它,因为它是一个非静态的内部类。所以要修复它,只需创建Customerstatic即可。

public static class Customer {}

作为一般规则,当与JSON和杰克逊一起使用泽西时,通常当你得到400时,这对杰克逊来说是一个问题,杰克逊非常擅长吐出一条有助于我们调试的有意义的信息。