单元测试一个Java Servlet

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

我想知道什么是对servlet进行单元测试的最佳方式。

只要不引用servlet上下文,测试内部方法就不是问题,但是如何测试doGet / doPost方法以及引用上下文或使用会话参数的内部方法?

有没有一种方法可以简单地使用诸如JUnit之类的经典工具,或者最好使用TestNG?我是否需要嵌入一个tomcat服务器或类似的东西?

提问于
用户回答回答于

尝试使用HttpUnit,尽管您可能最终编写的自动化测试更多的是“集成测试”(模块)而不是“单元测试”(单个类)。

用户回答回答于

大多数时候我通过“Integration测试”而不是纯粹的单元测试来测试Servlets和JSP。JUnit / TestNG提供了大量附件,包括:

  • HttpUnit(最古老和最知名的,非常低的水平可以是好的或坏的取决于你的需求)
  • HtmlUnit(比HttpUnit更高级别,对许多项目来说更好)
  • JWebUnit(位于其他测试工具之上并试图简化它们 - 我更喜欢)
  • WatiJ和Selenium(使用您的浏览器进行测试,这是更重量级但实际)

这是一个简单的Order Processing Servlet的JWebUnit测试,它处理来自'orderEntry.html'形式的输入。它期望客户ID,客户名称和一个或多个订单项目:

public class OrdersPageTest {
    private static final String WEBSITE_URL = "http://localhost:8080/demo1";

    @Before
    public void start() {
        webTester = new WebTester();
        webTester.setTestingEngineKey(TestingEngineRegistry.TESTING_ENGINE_HTMLUNIT);
        webTester.getTestContext().setBaseUrl(WEBSITE_URL);
    }
    @Test
    public void sanity() throws Exception {
        webTester.beginAt("/orderEntry.html");
        webTester.assertTitleEquals("Order Entry Form");
    }
    @Test
    public void idIsRequired() throws Exception {
        webTester.beginAt("/orderEntry.html");
        webTester.submit();
        webTester.assertTextPresent("ID Missing!");
    }
    @Test
    public void nameIsRequired() throws Exception {
        webTester.beginAt("/orderEntry.html");
        webTester.setTextField("id","AB12");
        webTester.submit();
        webTester.assertTextPresent("Name Missing!");
    }
    @Test
    public void validOrderSucceeds() throws Exception {
        webTester.beginAt("/orderEntry.html");
        webTester.setTextField("id","AB12");
        webTester.setTextField("name","Joe Bloggs");

        //fill in order line one
        webTester.setTextField("lineOneItemNumber", "AA");
        webTester.setTextField("lineOneQuantity", "12");
        webTester.setTextField("lineOneUnitPrice", "3.4");

        //fill in order line two
        webTester.setTextField("lineTwoItemNumber", "BB");
        webTester.setTextField("lineTwoQuantity", "14");
        webTester.setTextField("lineTwoUnitPrice", "5.6");

        webTester.submit();
        webTester.assertTextPresent("Total: 119.20");
    }
    private WebTester webTester;
}

扫码关注云+社区