我们有一个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模拟。否则你会混合使用模拟设置技术......
答案 0 :(得分:4)
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
}
答案 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。