【问题标题】:How to mock HttpServletRequest in Spock如何在 Spock 中模拟 HttpServletRequest
【发布时间】:2012-05-25 09:20:15
【问题描述】:

我们有一个 ServletFilter,我们想用 Spock 进行单元测试并检查对 HttpServletRequest 的调用。

以下代码抛出 java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/http/Cookie

def "some meaningless test"(){
    given:
    HttpServletRequest  servletRequest = Mock(HttpServletRequest)

    when:
    1+1

    then:
    true
}

JavaEE 5 API(以及因此的 Servlet API)位于类路径中。 Spock 版本是 0.6-groovy-1.8。

我们将如何正确地做到这一点?它可以与 Mockito 一起使用,但我们会失去 Spock 的嘲讽功能。

编辑:我们知道 Grails 和 Spring 内置的 Servlet 模拟功能,我们只是想知道是否有办法使用 Spock 模拟来做到这一点。否则,您将混合使用模拟设置技术...

【问题讨论】:

    标签: java servlets groovy mocking spock


    【解决方案1】:

    Grails 自动为每个集成测试配置 MockHttpServletRequestMockHttpServletResponseMockHttpSession,您可以在测试中使用它们。

    在单元测试中,您需要导入并实例化一个新的MockHttpServletRequest

    import org.springframework.mock.web.MockHttpServletRequest
    
    def "some meaningless test"(){
        given:
        def servletRequest = new MockHttpServletRequest()
    
        when:
        1+1
    
        then:
        true
    }
    

    【讨论】:

    • 我们没有在项目中使用 Grails(或 Spring)。虽然我们可以使用 Spring 模拟,但我们必须以 Spring 方式配置和检查模拟上的调用。我们正在寻找一种可以使用 Spock 交互定义的方法。如果那不可能,我会对为什么感兴趣。
    【解决方案2】:

    Spock 使用 JDK 动态代理来模拟接口,使用 CGLIB 来模拟类。 Mockito 对两者都使用 CGLIB。这似乎在模拟接口(如javax.servlet.http.HttpServletRequest)引用类(如javax.servlet.http.Cookie)的某些情况下有所不同。显然,在 Spock 的案例中,Cookie 类被加载,这会导致类加载错误,因为 servlet API Jar 中的类没有方法体(而不是空的方法体)。

    目前,Spock 没有提供强制将 CGLIB 用于接口的方法。这意味着您可以将 servlet 实现 Jar 而不是 API Jar 放在测试类路径上(无论如何这可能是更安全的选择),或者使用 Mockito。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 2021-12-23
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多