2014-09-17 5 views
3

Я разрабатываю облегченный сервер приложения с RESTful API реализованной с Джерси 2.12 и Джексоном 2.JerseyTest WebTarget POST поддержка

Я пишу тесты при разработке с использованием JUnit и JerseyTest. Я знаю, что мои ресурсы в Джерси работают так, как ожидалось, включая сортировку с JSON и JSON, потому что я тестировал их вручную с помощью плагина PostMan Chrome.

Моих тесты GET с параметрами запроса работают слишком хорошо, на основе, например, в Jersey documentation Вот упрощенный (я опустил шаблонный код, чтобы сделать идею более ясным) пример теста я хотел бы написать:

import static org.junit.Assert.assertTrue; 

import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.core.Response; 

import org.glassfish.jersey.server.ResourceConfig; 
import org.glassfish.jersey.test.JerseyTest; 
import org.junit.Test; 

import com.acme.api.rest.SessionsEndPoint; 
import com.acme.api.rest.beans.UserCredentialsBean; 

public class TestSession extends JerseyTest { 

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

    @Test 
    public void test() { 
     UserCredentialsBean userCredentialsBean = new UserCredentialsBean(); 
     userCredentialsBean.setUserId("alice"); 
     userCredentialsBean.setPassword("secret"); 
     WebTarget theTarget = target("sessions/login"); 
     Response response = theTarget.request().post(Entity.entity(UserCredentialsBean.class, "application/json")); 
     assertTrue(true); 
    } 

} 

Основная проблема заключается в том, что я не могу найти документацию о том, как правильно использовать класс WebTarget для почтовых запросов. WebTarget theTarget построена правильно, но строка:

Response response = theTarget.request().post(Entity.entity(UserCredentialsBean.class, "application/json")); 

не работает.

Как я понимаю, класс WebTarget является довольно новым в рамках JerseyTest. Есть ли кто-нибудь, кто может указать мне на любую недавнюю документацию, примеры или просто объяснить, как я могу заставить это работать?

ответ

5

Я сделал много поискового запроса, прежде чем отправил свой вопрос здесь, но после проверки назад мои глаза внезапно упали на этот Related Question. Я несколько раз искал SO, но так и не нашел этого вопроса. В любом случае, вот решение моей проблемы:

Я начал реализовывать, как объяснено в принятом ответе, и заставил его работать быстро.

Тогда я решил, что вы должны избегать использования строковых представлений JSON вообще, и я получил это для работы.

Код выше работает, если изменяются следующим образом:

import static org.junit.Assert.assertTrue; 

import javax.ws.rs.client.Entity; 
import javax.ws.rs.client.WebTarget; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.core.Response; 

import org.glassfish.jersey.server.ResourceConfig; 
import org.glassfish.jersey.test.JerseyTest; 
import org.junit.Test; 

import com.acme.api.rest.SessionsEndPoint; 
import com.acme.api.rest.beans.UserCredentialsBean; 

public class TestSession extends JerseyTest { 

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

    @Test 
    public void test() { 
     UserCredentialsBean userCredentialsBean = new UserCredentialsBean(); 
     userCredentialsBean.setUserId("alice"); 
     userCredentialsBean.setPassword("secret"); 
     LoginResponseBean loginResponseBean = 
      target("sessions/login") 
       .request(MediaType.APPLICATION_JSON_TYPE) 
       .post(
        Entity.entity(
         userCredentialsBean, 
         MediaType.APPLICATION_JSON_TYPE 
        ), 
        LoginResponseBean.class 
       ); 
     assertTrue(
       loginResponseBean.isSuccess() 
      && 
       loginResponseBean.getToken().length()==36 
     ); 

    } 

} 

LoginResponseBean является простым Java Bean. Просто getters и seters и конструктор по умолчанию.

Marshalling to - и от JSON выполняется каркасом либо moxy, либо jackson как поставщик JSON.