在JUnit测试中运行Jettys ServletTester [英] Run Jettys ServletTester within JUnit test
问题描述
我正在尝试在JUnit测试中运行Jettys ServletTester
.我首先创建了一个简单的HelloServlet
来测试设置,但是当我尝试请求servlet时却得到了IllegalAccessException
.这是我到目前为止的内容:
I'm trying to run Jettys ServletTester
in my JUnit test. I created a simple HelloServlet
first to test the setup, but I get an IllegalAccessException
when I try to request the servlet. Here is what I have so far:
@Before
public void setUp() throws Exception {
tester = new ServletTester();
tester.setContextPath("/context");
tester.addServlet(HelloServlet.class, "/hello/*");
tester.start();
}
@After
public void tearDown() throws Exception {
tester.stop();
}
@Test
public void testDefaultServlet() throws Exception {
HttpTester request = new HttpTester();
request.setMethod("GET");
request.setHeader("Host","127.0.0.1");
request.setURI("/context/hello/info");
request.setVersion("HTTP/1.0");
HttpTester response = new HttpTester();
response.parse(tester.getResponses(request.generate()));
assertNull(response.getMethod());
assertEquals(200,response.getStatus());
assertEquals("<h1>Hello Servlet</h1>",response.getContent());
}
我的HelloServlet
此Servlet是在与单元测试相同的文件中定义的,因为我希望它存在于码头的初始设置中.一切运行完毕后,我将其删除(或者保留它,但随后它将保留在单元测试中).
My HelloServlet
This servlet is defined in the same file as the unit test, because I want it to be there for the initial setup of jetty. After everything is running, I'll remove it (or maybe keep it, but it will stay within the unit test then).
更新该Servlet是在单元测试内部定义的,因为它仅是作为码头服务器本身的配置测试.但是码头无法访问它,将其移入公共类并成为一个文件之后,一切正常进行.查看评论.
Update This servlet was defined inside the unit test itself because it was meant only as a configuration test for the jetty server itself. But jetty wasn't able to access it, and after moving it into a public class and a file for itself everything worked like expected. See the comment.
class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
out.println("Hello, World!");
out.flush();
}
}
我的例外...
2009-10-20 09:36:28.973::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
2009-10-20 09:36:28.989::INFO: jetty-6.1.21
2009-10-20 09:36:29.098::INFO: Started LocalConnector@0.0.0.0:1
2009-10-20 09:36:29.161:/context:WARN: unavailable
java.lang.IllegalAccessException: Class org.mortbay.jetty.servlet.Holder can not access a member of class my.package.HelloServlet with modifiers ""
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.Class.newInstance0(Class.java:349)
at java.lang.Class.newInstance(Class.java:308)
at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428)
at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:536)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:915)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:539)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:405)
at org.mortbay.jetty.LocalConnector.accept(LocalConnector.java:186)
at org.mortbay.jetty.AbstractConnector$Acceptor.run(AbstractConnector.java:707)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
足够奇怪,因为我几乎直接从 http://docs.codehaus获得了这个示例. org/display/JETTY/ServletTester .对在junit测试中嵌入嵌入式码头servlet容器有什么想法或可行的例子吗?
Strange enough, because I got this example almost straight from http://docs.codehaus.org/display/JETTY/ServletTester. Any thoughts or maybe a working example of a embedded jetty servlet container in a junit test?
推荐答案
您的HelloServlet必须实现为公共类:
Your HelloServlet must be implemented as a public class:
public class HelloServlet extends HttpServlet { ... }
这篇关于在JUnit测试中运行Jettys ServletTester的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!