【问题标题】:Instance of MessageSource in a test controller (calling a service that calls a MessageSource.)测试控制器中的 MessageSource 实例(调用调用 MessageSource 的服务。)
【发布时间】:2016-03-22 15:40:24
【问题描述】:

我正在使用 grails 2.3.6,我正在尝试测试一个控制器,该控制器调用一个调用 MessageSource 的服务。我已经尝试了这篇文章 (How to unit or integration test use of injected messageSource for i18n in Grails 2.0 service) 中的所有解决方案,但我仍然收到此错误:

org.springframework.context.NoSuchMessageException: No message found under code 'enrolment.state.approved' for locale 'es_ES'.
    at es.portel.accessRequest.enyca.EnrolmentClientService.enrolmentTranslateState(EnrolmentClientService.groovy:30)
    at es.portel.accessRequest.enyca.EnrolmentClientService.enromentsTranslateState_closure1(EnrolmentClientService.groovy:13)
    at es.portel.accessRequest.enyca.EnrolmentClientService.enromentsTranslateState(EnrolmentClientService.groovy:12)
    at es.portel.accessRequest.enyca.EnrolmentClientController.getAllEnrolments(EnrolmentClientController.groovy:41)
    at es.portel.accessRequest.enyca.EnrolmentClientControllerSpec.test getAllEnrolments method(EnrolmentClientControllerSpec.groovy:34)

这是我的测试代码:

@TestFor(EnrolmentClientController)
 @Mock(EnrolmentClientService)
 class EnrolmentClientControllerSpec extends Specification{
    void "test getAllEnrolments method"() {
       given:
       MessageSource messageSource = getMessageSource()
       controller.enrolmentClientService = new EnrolmentClientService()
       controller.enrolmentClientService.messageSource = messageSource
       Locale locale1 = new Locale("es_ES")
       messageSource.addMessage('enrolment.state.approved',locale1, 'Aprobado')

       when:
       controller.getAllEnrolments()

       then:
       assertEquals response.status,  HttpServletResponse.SC_OK
       assertEquals response.format, 'json'
       }
   }

有什么想法吗? 提前致谢。

【问题讨论】:

  • 您是单元测试EnrolmentClientController 并模拟您的EnrolmentClientService,因此您不能使用new EnrolmentClientService(),因为它被Grails 模拟。尝试删除该行
  • 它不起作用,仍然得到同样的错误。无论如何,谢谢。

标签: grails spock


【解决方案1】:

头疼了几下,终于解决了。我按照 saw303 的说明取消了模拟服务并进行了正确的设置。这是工作代码:

@TestFor(EnrolmentClientController)
class EnrolmentClientControllerSpec extends Specification {
    @Shared
    def messageSource = new StaticMessageSource()

    def setupSpec() {
        Locale locale1 = new Locale("es_ES")
        messageSource.useCodeAsDefaultMessage = true
        messageSource.addMessage "enrolment.state.approved", locale1, "Aprobado"
    }


    void "test getAllEnrolments method"() {
       given:
       controller.enrolmentClientService = new EnrolmentClientService()
       controller.enrolmentClientService.messageSource = messageSource

       when:
       request.method = 'GET'
       response.format = 'json'
       controller.getAllEnrolments()
    }
}

【讨论】:

  • 很高兴这对你有用。但是由于您是单元测试,因此您的单元测试应该只测试控制器的行为。在理想情况下,控制器服务依赖项是模拟的。您要测试的场景更适合编写集成测试。在这种情况下,您不必模拟消息源并测试您的控制器与您的服务的集成。
猜你喜欢
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多