代码之家  ›  专栏  ›  技术社区  ›  cringe

在JUnit测试中运行Jettys servletter

  •  4
  • cringe  · 技术社区  · 15 年前

    我想开码头 ServletTester 在我的JUnit测试中。我创造了一个简单的 HelloServlet 首先测试设置,但我得到一个 IllegalAccessException 当我试图请求servlet时。以下是迄今为止我所拥有的:

    我的单元测试

    @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());
    }
    

    我的 地狱车

    这个servlet与单元测试在同一个文件中定义,因为我希望它在Jetty的初始设置中存在。在一切运行之后,我将删除它(或者保留它,但它将保留在单元测试中)。

    更新 这个servlet是在单元测试本身中定义的,因为它只是作为Jetty服务器本身的配置测试。但Jetty无法访问它,在将它移入公共类和文件之后,一切都按预期工作。请参见注释。

    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容器 ?

    1 回复  |  直到 15 年前
        1
  •  7
  •   jarnbjo    15 年前

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

    public class HelloServlet extends HttpServlet { ... }