【问题标题】:Run Jettys ServletTester within JUnit test在 JUnit 测试中运行 Jettys ServletTester
【发布时间】:2010-12-08 06:13:09
【问题描述】:

我正在尝试在我的 JUnit 测试中运行 Jettys ServletTester。我首先创建了一个简单的HelloServlet 来测试设置,但是当我尝试请求servlet 时我得到一个IllegalAccessException。这是我目前所拥有的:

我的单元测试

@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 与单元测试在同一个文件中定义,因为我希望它存在于码头的初始设置中。一切运行后,我将删除它(或者保留它,但它会留在单元测试中)。

更新 这个 servlet 是在单元测试本身中定义的,因为它只是作为码头服务器本身的配置测试。但是码头无法访问它,并且在将其移动到公共类和自己的文件之后,一切都按预期工作。见评论。

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 测试中嵌入 jetty servlet 容器的任何想法或工作示例?

【问题讨论】:

    标签: unit-testing servlets junit jetty


    【解决方案1】:

    您的 HelloServlet 必须作为公共类实现:

    public class HelloServlet extends HttpServlet { ... }
    

    【讨论】:

    • 对不起,我忘了说我的 HelloServlet 与单元测试在同一个文件中定义。
    • 哦,废话。它必须在测试之外定义为公开,以便 ServletHolder 可以访问它......非常感谢。 :-)
    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2011-11-12
    • 2012-06-21
    相关资源
    最近更新 更多