2015-10-18 2 views
1

Я пытаюсь написать простой тестовый класс, который эмулирует веб-службу RESTful, создавая клиента с помощью метода POST. Не удалось выполнить assertEquals, я получил ответ 400 Bad Request. Я не могу использовать отладчик для отслеживания трассировки стека. Однако консоль сообщает мне следующее ...Как отправить/принять JSON с помощью JerseyTest Framework

INFO: Начальный слушатель, связанный с [localhost: 9998]
INFO: [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); 
    } 
} 

ответ

3

Вместо печати response.toString(), вы можете прочитать фактическое тело с помощью response.readEntity(String.class). То, что вы найдете в теле сообщения об ошибке от Джексона

Нет подходящий конструктор найдено для типа [простой тип, класс simple.SimpleTest $ клиента]: не может создать экземпляр из объекта JSON (нужно добавить/включить тип информация?)

На первый взгляд ваш класс Customer выглядит нормально; он имеет конструктор по умолчанию. Но действительно проблема в том, что Джексон не может создать экземпляр, потому что это нестатический внутренний класс. Поэтому, чтобы исправить это, просто сделайте класс Customerstatic.

public static class Customer {} 

Как правило, при работе с JSON и Джексоном-Джерси, часто, когда вы получаете 400, это аа проблему с Джексоном, и Джексон очень хорошо выплевывая значимое сообщение, которое поможет нам отлаживать ,

+1

Вы удивительный человек. Вы только что решили проблему, которая наказывала меня более 6 часов. THANK YOU –

+0

@JasonJavier Спасибо за [MCVE] (http://stackoverflow.com/help/mcve), кстати. Вот как я стараюсь поощрять связанные с Джерси вопросы. Что-то мы можем скопировать и вставить в один класс для тестирования. Даже если вопрос не связан с тестовой базой, включение всех функциональных возможностей в один runnable-тест помогает быстрее определить проблему. Это также помогает OP сузить область проблем, поэтому отладка более сфокусирована. –