我在将JerseyTest与之前使用validateSession方法的资源一起使用时,当资源不使用validateSession时,它可以正常工作,但是用validateSession扩展类会在测试中引发500错误。我认为是因为在测试中HttpServletRequest为空。我尝试先在相同方法测试中进行测试之前登录,但是失败。任何帮助。这是简单的资源:
@Path("/test")
public class Prueba extends BaseLoginWebService {
final static Logger logger = Logger.getLogger(Prueba.class);
@GET
public String saludo() {
return "it works";
}
}
为了返回String的资源,请使用带有validateSession方法的BaseLoginWebService,之前它使用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 .....
最佳答案
请检查您使用的是哪个测试容器。根据https://jersey.java.net/nonav/documentation/latest/test-framework.html上的文档
内存中的容器不是真实的容器。它开始泽西岛
应用程序并直接调用内部API来处理创建的请求
由测试框架提供的客户端。没有网络
涉及的沟通。该容器不支持servlet和
其他依赖于容器的功能,但这对于
简单的单元测试。
因此,如果您使用内存容器,并尝试使用servlet功能,它将无法正常工作。在这种情况下,请尝试使用grizzly提供程序或接近最终部署目标的其他程序