如何在Spock中模拟HttpServletRequest

时间:2012-05-25 09:20:15

标签: java servlets groovy mocking spock

我们有一个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模拟。否则你会混合使用模拟设置技术......

2 个答案:

答案 0 :(得分:4)

Grails会自动使用您可以在测试中使用的MockHttpServletRequestMockHttpServletResponseMockHttpSession来配置每个集成测试。

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

import org.springframework.mock.web.MockHttpServletRequest

def "some meaningless test"(){
    given:
    def servletRequest = new MockHttpServletRequest()

    when:
    1+1

    then:
    true
}

答案 1 :(得分: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。