【问题标题】:unit test a servlet with an embedded Jetty使用嵌入式 Jetty 对 servlet 进行单元测试
【发布时间】:2012-12-20 05:25:12
【问题描述】:

我们如何使用嵌入式 Jetty 服务器对 servlet 进行单元测试?

比如下面的servlet方法如何测试?

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    //any logic inside
}

【问题讨论】:

    标签: unit-testing servlets jetty


    【解决方案1】:

    我非常喜欢使用 junit 之类的东西来引导它,并使用嵌入的 jetty 实例来测试 servlet。

    http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/examples/embedded/src/main/java/org/eclipse/jetty/embedded/MinimalServlets.java

    这是如何做到这一点的最小示例。

    这也是我们测试绝大多数码头本身的方式,启动并运行它。

    对于特定的 servlet 或处理程序,我们经常在 jetty-test-helper 工件中使用 jetty-client 或 SimpleRequest。 URLConnection 也可以。

    http://git.eclipse.org/c/jetty/org.eclipse.jetty.toolchain.git/tree/jetty-test-helper/src/main/java/org/eclipse/jetty/toolchain/test/SimpleRequest.java

    这是 jetty-client 中的一个测试,它是针对 jetty-9 的,所以如果你想要 7 或 8 则在相应的标签下查看,它在 jetty-9 中进行了相当多的重构。

    http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java

    注意:我建议您传递 0 作为码头启动的端口,这将为您提供一个随机开放端口,然后您可以将其拉出码头进行测试,这避免了多个构建运行的情况可能存在端口冲突的 CI 或并行构建。

    【讨论】:

    • 这很有帮助。但是在您的示例中,它并没有真正显示我们如何通过向 servlet 发出请求来测试 HelloServlet(或更复杂的东西)。请您提供更多信息吗?
    【解决方案2】:

    你不需要Jetty来测试servlet,你需要一个单元测试框架,比如JUnit、Mockito、JMock等。

    一般来说,您在进行单元测试时不希望使用 servlet 容器,因为您希望将测试重点放在正在测试的实际方法上,使用 jetty 意味着您也在测试 jetty 行为。完成所有单元测试后,您可以继续进行集成测试和系统测试,这部分可能涉及外部系统,例如码头(使用自动化框架,例如 Selenium。)

    我使用 Mockito 和 PowerMock 进行单元测试,您可以查看 this code 以获得真实在线服务的工作示例(您可以找到 here)。 我写了一个关于这个服务的教程和它包含的内容,这个可以找到here。

    [在对此答案不时投反对票后添加]:并且冒着获得更多反对票的风险,所有反对票的人都需要在单击 -1 按钮之前阅读 UNIT TESTING 的定义。你只是不知道你在说什么。

    【讨论】:

    • 非常感谢您的回答。但是如果我想借助 Jetty 让单元测试更像是集成测试呢?那我该如何测试呢?
    • 不同意上面的答案,最好测试一下你的servlet在JEE容器中的行为,因为这就是它在现实生活中的运行方式。比在模拟对象中更好地了解您的代码在现实生活中的工作方式。
    • 我支持这个答案,这个问题特别提到了“单元测试”。如果 OP 想要运行集成测试,那么标题是错误的。
    • 这种方法不适用于创建测试实际打开网络连接的客户端代码的环境 - 模拟不会创建服务器,这会使假设网络连接的代码测试变得非常复杂。跨度>
    • 您的说法是正确的,它不支持网络连接,但是如果您阅读了 cmets,您就会明白我们在谈论单元测试而不是集成测试。事实上,在对 javascript(或其他客户端代码)进行单元测试时,您会伪造网络连接以防止网络问题影响您的测试结果。您不希望单元测试失败(这会推断代码问题),因为有人拔掉了网线...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多