2016-10-30 2 views
0

Я использую метод JerseyTest с ресурсом, который использует метод validateSession раньше, когда ресурс не использует validateSession, он отлично работает, но расширение класса с помощью validateSession вызывает ошибку 500 в тесте. Я думаю, это потому, что в тесте HttpServletRequest имеет значение null. Я пытаюсь сначала сделать логин перед тестом в том же тесте метода, но не получится. Любая помощь. Это простой ресурс:JerseyTest не работает, потому что HttpServletRequest имеет значение

@Path("/test") 
public class Prueba extends BaseLoginWebService { 

final static Logger logger = Logger.getLogger(Prueba.class); 

@GET 
public String saludo() { 
    return "it works"; 
    } 
} 

Ресурс для того, чтобы вернуть строку, используйте BaseLoginWebService методом validateSession, ранее он используется LoginWebService:

public class BaseLoginWebService { 

@Context 
HttpServletRequest request; 

final static Logger logger = Logger.getLogger(Prueba.class); 

@PostConstruct 
public void init() throws Exception { 
    validateSession(); 
} 

private void validateSession() throws Exception { 
    HttpSession session = request.getSession(); 
    Cookie[] cookies = request.getCookies(); 
    String token = null; 
    for (Cookie cookie : cookies) { 
     if ((cookie.getValue().equals(session.getAttribute("token")))) { 
      token = (String) session.getAttribute("token"); 
      break; 
     } 
    } 
    if (token == null) { 
     throw new Exception("no session"); 
    } 
} 
} 

LoginWebService:

@Path("/login") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class LoginWebService { 

@Context 
HttpServletRequest request; 

@POST 
public Response login(LoginEntity loginEntity) { 
    if (loginEntity != null) { 
     if (loginEntity.getUser().equals("root") && loginEntity.getPassword().equals("root")) { 
      HttpSession session = request.getSession(); 
      session.setMaxInactiveInterval(5); 
      Random random = new Random(); 
      int token = random.nextInt(100) + 1; 
      session.setAttribute("token", String.valueOf(token)); 
      return Response.noContent().cookie(new NewCookie("token", String.valueOf(token))).build(); 
     } else { 
      return Response.status(Response.Status.BAD_REQUEST).build(); 
     } 
    } else { 
     return Response.status(Response.Status.CONFLICT).build(); 
    } 
} 
} 

Ресурс отлично работает, но в испытаниях нет:

public class PruebaTest extends JerseyTest { 

@Override 
public Application configure() { 
    enable(TestProperties.DUMP_ENTITY); 
    enable(TestProperties.LOG_TRAFFIC); 
    return new ResourceConfig(Prueba.class); 
} 

@Override 
protected TestContainerFactory getTestContainerFactory() throws TestContainerException { 
    return new ExternalTestContainerFactory(); 
} 

@Override 
protected URI getBaseUri() { 
    URI uri = UriBuilder.fromPath("http://localhost:9090/messenger_webapp/rest").build(); 
    return uri; 
} 

@Test 
public void saludoTest() { 
    System.out.println("saludoTest"); 
    String output = target("/test").request().get(String.class); 
    assertEquals("Should return it works", "it works", output); 
} 
} 

Ошибка:

javax.ws.rs.InternalServerErrorException: HTTP 500 Request failed. 

at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1020) 
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:816) 
    ..... and more ..... 

ответ

0

Пожалуйста, проверьте, какие testcontainer вы используете. Согласно документации на https://jersey.java.net/nonav/documentation/latest/test-framework.html

In-Memory container is not a real container. It starts Jersey application and directly calls internal APIs to handle request created by client provided by test framework. There is no network communication involved. This containers does not support servlet and other container dependent features, but it is a perfect choice for simple unit tests.

Итак, если вы, используя в контейнере памяти и попытаться использовать сервлет функции он не будет работать. В этом случае попробуйте использовать поставщика гризли или что-то еще, что близко к вашей конечной цели развертывания

Смежные вопросы