如何在Grails / Spock中模拟HttpServletRequest的BufferedReader有效负载

时间:2014-08-01 19:18:33

标签: unit-testing grails groovy spock

我有一个Grails控制器,需要一个XML有效负载。

我在Grails控制器中获取这样的XML有效负载。

def xmlPayload = request.reader.text

那部分工作正常,但我正在努力在单元测试中模拟这个有效载荷。

我已经尝试了以下两种方法,但是调试器在两种方法中都显示“request.reader”为空。

方法#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行),但到目前为止还没有运气。

感谢任何想法。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

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/>'
    }
}

请参阅Unit Testing Controllers中的测试XML和JSON请求

答案 1 :(得分:1)

如果您只需要为请求提供内容,那么您不需要模拟任何内容。

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

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

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

此类 Mock 类的一个目的(如Spring Test等)是为了避免使用外部库进行显式模拟。