我需要在测试开始时启动并运行Jetty服务器。 Jetty服务器必须获取Spring上下文并启动一组RESTful服务。然后我需要使用Jetty使用的上下文并将一些模拟的服务实现注入到某个服务提供者bean中,这样我就可以测试该服务获得正确的请求和响应并进行身份验证。
我创建了简单的bootstrap类:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class RESTServiceTest {
@BeforeClass
public static void setUp() throws Exception {
Server server = new Server(8080);
WebAppContext ctx = new WebAppContext();
ctx.setContextPath("/");
ctx.setWar("src/main/webapp");
ctx.setServer(server);
server.setHandler(ctx);
server.start();
Thread.sleep(5000);
}
@Test
public void testPush() throws Exception {
// do some tests here...
}
}
然而,在启动此单元测试时,我收到以下错误:
Context initialization failed
java.lang.IllegalStateException: Failed to invoke Servlet 2.5 getContextPath method
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:365)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:278)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:640)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:229)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1208)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:586)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:449)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89)
at org.eclipse.jetty.server.Server.doStart(Server.java:258)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58)
....
Caused by: java.lang.NoSuchMethodException: javax.servlet.ServletContext.getContextPath()
at java.lang.Class.getMethod(Class.java:1622)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:360)
... 30 more
所以我怀疑这里可能出现的问题是什么?我选择的方法是正确的吗?
为了获得Jetty并启动Spring上下文,我需要做什么?以及如何在测试体之后引用Spring上下文,所以我可以获得服务bean并使用模拟子服务调用一些setter?
请建议。
我不需要创建单元测试 - 这类似于使用模拟的端到端测试。
答案 0 :(得分:4)
方法javax.servlet.ServletContext.getContextPath()
不存在(因此无法调用)。
这意味着您的类路径中有一个旧servlet-X.jar
。方法getContextPath()
是自Servlet 2.5以来至少需要2.5。在这方面检查并修复您的依赖项(尤其是传递依赖项)。