簡體   English   中英

如何在Grails / Spock中模擬HttpServletRequest的BufferedReader有效負載

[英]How to mock a HttpServletRequest's BufferedReader payload in Grails/Spock

我有一個Grails控制器,需要一個XML有效負載。

我在Grails控制器中獲取這樣的XML有效負載。

def xmlPayload = request.reader.text

那部分工作正常,但我正在努力在單元測試中模擬這個有效載荷。

我已經嘗試了以下兩種方法,但調試器在兩種方法中都顯示'request.reader'為null。

方法#1:

void "test controller method"(){
    setup:
    def mockBufferedReader = Mock( BufferedReader )
    mockBufferedReader.getText() >> '<hello/>'
    request.getReader() >> mockBufferedReader
    ....

方法#2:

void "test controller method"(){
    setup:
    def mockBufferedReader = Mock( BufferedReader )
    mockBufferedReader.getText() >> '<hello/>'
    request.metaClass.getReader = { -> mockBufferedReader }
    ....

單元測試中的'request'是GrailsMockHttpServletRequest,所以我假設我可以像這樣模擬它的方法(兩種方法的第3行),但到目前為止還沒有運氣。

謝謝你的任何想法。

你可以做:

class EchoController {
    def echo () {
        render (request.reader.text)
    }
}


@TestFor(EchoController)
class EchoSpec extends Specification {
    def "echos XML data" () {
        request.XML = '<hello/>'

        when:
        controller.echo ()

        then:
        response.text == '<hello/>'
    }
}

請參閱在單元測試控制器中 測試XML和JSON請求

如果您只需要為請求提供內容,那么您不需要模擬任何內容。

 def "Spock works as expected"() {
    given:
    def request = new GrailsMockHttpServletRequest(content: '<hello/>')

    when:
    def result = request.getReader().getText()

    then:
    result == '<hello/>'
 }

這種Mock類的一個目的(如Spring Test等)是為了避免使用外部庫進行顯式模擬

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM