【发布时间】:2022-01-04 10:45:36
【问题描述】:
我正在尝试为我的一个控制器类编写测试。在这个控制器中,我调用request.reader.text,如果正文包含非utf-8 字符,它可以抛出MalformedInputException。
这就是我试图在我的 Spock 测试中测试和模拟的情况。最简单的方法是我可以模拟 getReader() 方法,但事实证明这很困难。
我尝试过的事情:
应该根据这篇文章工作(但不):How to mock HttpServletRequest in Spock
GrailsMockHttpServletRequest request = new GrailsMockHttpServletRequest()
request.getReader() >> {
throw new MalformedInputException(1)
}
也试过这个,根据@LeonardBrünings 的评论(但它似乎没有效果):
GroovySpy(GrailsMockHttpServletRequest, global: true) {
getReader() >> {
throw new MalformedInputException(1)
}
}
可重现的 repo(运行 ApplicationControllerSpec): https://github.com/Zorobay/test-app
【问题讨论】:
-
请编辑您的问题,提供MCVE,而不仅仅是迷你测试sn-p。可重复的测试用例极大地提高了您快速获得有用答案的机会。
-
@kriegaex 好了 :)
-
我现在可以重现这种情况,但我以前从未使用过 Grails 或其特殊的测试支持。我看到这个请求已经是某种特殊的模拟了。也许可以以某种方式配置该模拟,但您也注意到,没有直接设置阅读器的方法,这意味着只读。我想我在这里超出了我的深度,我不想开始考虑 Groovy 元类技巧。 Traits 也包含在 Grails 测试中,这并没有让事情变得更容易。也许另一种 Grails 测试类型更适合,我不知道。其他人可以更好地帮助你,对不起。
-
您可以使用全局
GroovySpy,因为 grails 中的所有内容都使用 Groovy。 -
@LeonardBrünings 我不确定我将如何完成这项工作。我试过这个,但它似乎没有效果(代码添加到问题描述中)。
标签: grails groovy controller spock