Java Servlet单元测试

Java Servlet单元测试,java,unit-testing,servlets,testng,mockrunner,Java,Unit Testing,Servlets,Testng,Mockrunner,目前我正在使用TestNG框架测试应用程序业务逻辑,最近我添加了一些Servlet类 如何在TestNg框架中对这些Servlet类进行单元测试 我建议您将所有业务逻辑从servlet类转移到您自己可以测试的类中。这使得servlet成为业务逻辑和容器之间的粘合剂,没有任何值得测试的内容 诸如HttpServletRequest、ServletConfig等API类是使用您选择的模拟框架(JMock、Mockito等)的主要目标,因为它们都是接口。如果可能,请遵循skaffman的建议。如果不是

目前我正在使用TestNG框架测试应用程序业务逻辑,最近我添加了一些Servlet类


如何在TestNg框架中对这些Servlet类进行单元测试

我建议您将所有业务逻辑从servlet类转移到您自己可以测试的类中。这使得servlet成为业务逻辑和容器之间的粘合剂,没有任何值得测试的内容


诸如
HttpServletRequest
ServletConfig
等API类是使用您选择的模拟框架(JMock、Mockito等)的主要目标,因为它们都是接口。

如果可能,请遵循skaffman的建议。如果不是,或者如果您想测试servlet作为前端控制器的行为,而不是它们内部的业务逻辑,您可以使用:

  • (但我不知道它是否已经支持TestNG)

    • 最简单的方法之一是从码头出发。所有操作都是在嵌入式Jetty中自动完成的,因此在测试期间没有打开任何端口!如果使用Maven,则需要以下工件才能启用此方法:

      <dependency>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-servlet-tester</artifactId>
        <version>6.1.16</version>
        <scope>test</scope>
      </dependency>
      
      创建HTTP请求

      HttpTester request = new HttpTester(); 
      request.setMethod("GET");
      request.setHeader("Host","tester"); 
      request.setURI("/hello");
      request.setVersion("HTTP/1.0");
      
      调用servlet并检索响应:

      HttpTester response = new HttpTester();
      response.parse(tester.getResponses(request.generate()));
      
      断言要在响应及其内容上检查的内容:

      assertEquals(200,response.getStatus()); 
      assertEquals("Hello Servlet",response.getContent());
      

      谢谢Bozho,Selenium支持TestNG吗?是的,Selenium支持TestNG。不过,我只会在需要并行运行测试时使用它。如果没有,请使用JUnit。谢谢Skaffman,我的servlet处理会话和cookie相关的操作。因此,将这些逻辑移到另一个类是不可能的。我正在寻找一个API,它允许我在testNG中对servlet进行单元测试。@Thomman:这总是可能的——只需将servlet委托给业务逻辑类即可。servlet中不需要任何东西。仍然可以在servlet级别进行测试,尽管这将是集成测试而不是单元测试。@koppernickus:我可以将这个测试类与TestNG集成吗?@Thomman:可以。这个类独立于任何测试框架。其他servlet测试人员需要一个端口等,可能是
      assertEquals(200,response.getStatus()); 
      assertEquals("Hello Servlet",response.getContent());