[英]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使用可以在测试中使用的MockHttpServletRequest
, MockHttpServletResponse
和MockHttpSession
自动配置每个集成测试。
在单元测试中,您需要导入并实例化一个新的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.