Spock 未找到线程绑定请求

Spock No thread-bound request found

我创建了一个简单的实用程序 class UtilService.groovy 并且当我尝试 运行 为它编写测试用例时。 class UtilService {

static transactional = true

def messageSource


HttpServletRequest getCurrentRequest() {
    GrailsWebRequest webUtils = WebUtils.retrieveGrailsWebRequest()
    def request = webUtils.getCurrentRequest()
    return request
}

String getMessage(String code, Object[] args = null, String defaultMessage = null) {
    HttpServletRequest request = currentRequest
    Locale locale = request.locale
    if (defaultMessage) {
        return messageSource.getMessage(code, args, defaultMessage, locale)
    } else {
        return messageSource.getMessage(code, args, locale)
    }
}

测试用例

@TestMixin(GrailsUnitTestMixin)
class UtilServiceSpec extends Specification {

    void "Test get message"() {
        setup:
            def utilService = new UtilService()

        when:
            String data = utilService.getMessage("payCode.label")

        then:
            data == "Pay Code"
    }
}

错误:

No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? 

我已经搜索并尝试了来自 google 的一些链接,但它们对我不起作用。

显然,您是在网络请求之外执行此操作,WebUtils.retrieveGrailsWebRequest() 将失败,因为没有正在进行的网络请求。如果在测试期间从控制器调用您的服务,它应该可以工作。

为什么不将区域设置作为参数传递给 getMessage 而不是依赖于 WebRequest 的服务,控制器可以调用 getMessage 并传递请求区域设置,否则服务将选择默认区域设置。让服务知道 web api(例如请求、响应、会话等)通常不是一个好主意。您将能够同时测试服务和控制器。

我已经为此需求编写了集成测试而不是单元测试,并且能够 运行 我的测试用例成功。