Запрос на тестирование в Джерси

Я пытаюсь написать тестовый пример в Jersey Test Framework для службы аутентификации, как показано ниже:

Сервисный код:

@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
public class AuthenticationServices {
    @POST
    @Path("/login")
    public Response login(LoginRequest loginRequest, @Context HttpServletRequest request) {
       ...... 
     }

Тестовый код Jerysey:

import java.net.URISyntaxException;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import org.json.JSONException;
import org.junit.Test;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.test.framework.AppDescriptor;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
import com.vs.ant.sensordata.request.LoginRequest;

public class AuthenticationTest extends JerseyTest{
    @Override
    protected AppDescriptor  configure() {
        return new WebAppDescriptor.Builder("com.vs.ant.sensordata.services")
                                .contextPath("anttailbigdata")
                                .build();
    }

    @Test
    @Consumes("application/json")
    public void testLogin() throws JSONException,URISyntaxException {
        WebResource webResource = client().resource("http://localhost:8082/");
        String path = "SensorData/a/users/login";
        LoginRequest loginReq = new LoginRequest();
        loginReq.setUserId("admin");
        loginReq.setPassword("a");
        Entity<LoginRequest> loginEntity = Entity.entity(loginReq, MediaType.APPLICATION_JSON);
        ClientResponse resp = webResource.path(path).post(ClientResponse.class, loginEntity);
    }
}

При попытке выполнить вышеуказанный тест я получаю следующее исключение:

com.sun.jersey.api.client.ClientHandlerException:  
com.sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class javax.ws.rs.client.Entity, and MIME media type, application/octet-stream, was not found
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
at com.sun.jersey.api.client.WebResource.post(WebResource.java:251)
at com.vs.ant.sensordata.services.AuthenticationTest.testLogin(AuthenticationTest.java:37)

Я новичок в тесте на джерси. Не уверен, что это происходит. Пожалуйста помоги.

РЕДАКТИРОВАТЬ: добавлена ​​аннотация @consumes над методом.

1 ответ

Решение

Вы используете тест Джерси 1.x, но Entity был представлен только в JAX-RS 2.x, т.е. в Джерси 2.x. Джерси 1.x не знает, как с этим справиться.

Вместо этого просто разместите сам объект, без каких-либо оберток Entityи установите его тип контента через WebResource#type(..) метод.

LoginRequest loginReq = new LoginRequest();
loginReq.setUserId("admin");
loginReq.setPassword("a");
ClientResponse resp = webResource.path(path)
        .type(MediaType.APPLICATION_JSON)
        .post(ClientResponse.class, loginReq);

Кроме того, если вы используете Jersey 1.x, то вам следует избавиться от любых ваших зависимостей JAX-RS 2.0, чтобы вы не запутались в том, что используете.

Другие вопросы по тегам