簡體   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