繁体   English   中英

如何在Spock中模拟HttpServletRequest

[英]How to mock HttpServletRequest in 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的模拟效果变得更糟。

编辑:我们了解用于Servlet的Grails和Spring内置的模拟功能,我们只是想知道是否有一种方法可以使用Spock模拟。 否则,您会混合使用各种模拟设置技术...

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

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

import org.springframework.mock.web.MockHttpServletRequest

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

    when:
    1+1

    then:
    true
}

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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM