嵌入式jetty ServletTester服务单个静态文件

时间:2009-11-16 13:57:07

标签: java unit-testing junit jetty

我是用jetty进行单元测试的,我不仅要服务于测试中的servlet,还要服务于静态页面。我的应用程序需要静态页面。我正在像这样初始化码头

tester = new ServletTester();
tester.setContextPath("/context");
tester.addServlet(MyServlet.class, "/servlet/*");
tester.start();

我现在需要的是像

tester.addStaticPage("local/path/in/my/workspace", "/as/remote/file");

码头有可能吗?

2 个答案:

答案 0 :(得分:3)

我认为你不能用ServletTester做到这一点。 ServletTester为servlet创建单个Context。您需要设置至少包含两个上下文的嵌入式jetty:一个用于servlet,另一个用于静态内容。

如果有完整的WebAppContext,则会设置,但没有。

您可以复制ServletTester并添加头发,或者您可以阅读API并配置必要的上下文。这是一个代码片段,向您展示基本想法,您将 无法按原样编译。您需要为静态内容创建合适的上下文。

        server = new Server();

        int port = Integer.parseInt(portNumber);
        if (connector == null) {
            connector = createConnector(port);
        }
        server.addConnector(connector);

        for (Webapp webapp : webapps) {
            File sourceDirFile = new File(webapp.getWebappSourceDirectory());
            WebAppContext wac = new WebAppContext(sourceDirFile.getCanonicalPath(), webapp.getContextPath());
            WebAppClassLoader loader = new WebAppClassLoader(wac);
            if (webapp.getLibDirectory() != null) {
                Resource r = Resource.newResource(webapp.getLibDirectory());
                loader.addJars(r);
            }
            if (webapp.getClasspathEntries() != null) {
                for (String dir : webapp.getClasspathEntries()) {
                    loader.addClassPath(dir);
                }
            }
            wac.setClassLoader(loader);
            server.addHandler(wac);
        }
        server.start();

答案 1 :(得分:0)

将资源库设置为包含静态内容的目录,并添加jetty“default servlet”以提供该内容。我已在下面的示例中添加了相应的代码。

tester = new ServletTester();
tester.setContextPath("/context");
tester.setResourceBase("/path/to/your/content");
tester.addServlet(MyServlet.class, "/servlet/*");
tester.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/*");
tester.start();