[英]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.