【问题标题】:Guice-servlet unit testingGuice-servlet 单元测试
【发布时间】:2015-01-04 04:31:22
【问题描述】:

背景:我正在使用 guiceguice-servlet 框架开发 servlet。我想通过以下方式测试我的 servlet:

  1. Servlet 单元测试:通过提供 get/post 请求将 servlet 与其他依赖项隔离并模拟客户端
  2. Servlet 集成测试:模拟客户端,但没有 servlet 隔离。另外,作为集成测试的一部分,我想测试我与 Guice 本身的集成。

问题:我正在寻找可以让我执行上述两种测试的 servlet 测试框架。

同时我查看了HttpUnit,但没有找到将Guice 连接到它的方法:servlet 可以在ServletRunner 中注册,但它们是由类名提供的。这意味着 ServletRunner 将实例化它们(不注入依赖项)。

我还找到了tadedon 项目的GuiceServletMockModule。似乎正是我正在寻找的东西。但我不确定它是否仍然保持不变。例如,我无法从他们的 maven 存储库中获取他们的 maven 包。

谢谢

【问题讨论】:

    标签: java unit-testing servlets guice guice-servlet


    【解决方案1】:

    为了对您的 servlet(HttpServlet 实例)进行单元测试,您不需要任何框架 - 您只需创建 servlet 类的新实例,并在传递模拟的请求和响应对象时直接调用所需的方法。

    如果您需要将代码与 Guice 依赖项隔离开来,您可以使用配置了 mocks 的 Injector(在 @Before 方法中)创建您的类的实例,例如:

    Injector injector = Guice.createInjector( new AbstractModule() {
        @Override
        protected void configure() {
            bind( MyClass.class ).toInstance( mock(MyClass.class) );
            bind( AnotherClass.class ).toInstance( mock(AnotherClass.class) );
        }
    } );
    //Create new instance of class  that needs injections
    ThirdClass thirdInstance = injector.getInstance( ThirdClass.class );
    

    至于集成测试,您可以尝试使用 SoapUI - 它适用于 SOAP 和 REST 应用程序,但您可以将其调整为通用 servlet 测试。

    【讨论】:

    • 我的问题不在于隔离。我正在寻找一个测试框架的原因是它允许模拟 HttpServletRequest/HttpServletResponse,因此可以在测试中轻松使用它们。例如,HttpUnit 允许模拟它们,但据我了解,模拟不会公开用于独立使用。相反,您可以使用 HttpUnit 模拟客户端。但在这种情况下,servlet 实例将由 HttpUnit 本身创建(通过类名,使用反射),因此依赖项将保持不注入
    • 至于集成测试,我的意图实际上是在实际部署之前执行部分集成。我也想在junit 下运行集成测试。只是在集成测试的情况下,我想检查整个 servlet,没有依赖隔离
    • 您可以使用 Mockito 框架来模拟任何对象,特别是 HttpRequest 和 HttpResponse:HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class); 集成测试需要 servlet 启动并运行,即实际部署到 servlet 容器(即 Tomcat 或 GAE)。
    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2013-04-07
    • 2010-09-08
    • 2015-11-24
    • 2010-09-10
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多