2012-05-25 39 views
4

我們有一個ServletFilter,我們希望用Spock進行單元測試並檢查對HttpServletRequest的調用。如何在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嘲笑來做到這一點。否則,你就會有嘲諷的技術建立一個混合...

回答

3

Grails的自動配置與MockHttpServletRequestMockHttpServletResponse每個集成測試,並MockHttpSession,你可以在你的測試使用。

在單元測試中,您需要導入並實例化一個新的MockHttpServletRequest

import org.springframework.mock.web.MockHttpServletRequest 

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

    when: 
    1+1 

    then: 
    true 
} 
+0

我們在項目中沒有使用Grails(或Spring)。雖然我們可以使用Spring模擬,但我們必須在Spring模式下配置和檢查模擬調用。我們正在尋找一種可以使用Spock交互定義的方式。如果這是不可能的,我會感興趣的原因。 –

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。

相關問題