Java 如何在Spock中模拟HttpServletRequest

Java 如何在Spock中模拟HttpServletRequest,java,servlets,groovy,mocking,spock,Java,Servlets,Groovy,Mocking,Spock,我们有一个ServletFilter,我们希望使用Spock进行单元测试,并检查对HttpServletRequest的调用 下面的代码抛出 java.lang.ClassFormatError:类文件javax/servlet/http/Cookie中非本机或抽象的方法中缺少代码属性 def "some meaningless test"(){ given: HttpServletRequest servletRequest = Mock(HttpServletRequest

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

下面的代码抛出
java.lang.ClassFormatError:类文件javax/servlet/http/Cookie中非本机或抽象的方法中缺少代码属性

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

    when:
    1+1

    then:
    true
}
JavaEE5API(以及ServletAPI)位于类路径上。Spock版本是0.6-groovy-1.8

我们如何才能做到这一点?它与Mockito一起工作,但我们会失去Spock mocking的威严


编辑:我们知道Grails和Spring内置的Servlet模拟功能,我们只是想知道是否有一种方法可以通过Spock模拟来实现。否则,您将混合使用模拟设置技术…

Grails会自动配置每个集成测试,并使用可在测试中使用的
MockHttpServletRequest
MockHttpServletResponse
MockHttpSession

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


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

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

我们在项目中没有使用Grails(或者Spring)。虽然我们可以使用Spring模拟,但我们必须以Spring的方式配置和检查模拟上的调用。我们正在寻找一种使用Spock交互定义的方法。如果不可能的话,我想知道为什么。
import org.springframework.mock.web.MockHttpServletRequest

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

    when:
    1+1

    then:
    true
}