Why is this method returning null even though the underlying controller is mocked using Spocks' Mock()?

自作多情 提交于 2019-12-12 01:28:41

问题


import grails.plugin.spock.*

class EventControllerSpec extends ControllerSpec {

    def "Creating a breadcrumb from an event"() {
        given: "I have a named event"
        def eventController = Mock(EventController)
        def event   = Mock(Event)
        event.title >> 'Space-Journey with Sprock and the Crew'
        event.title == 'Space-Journey with Sprock and the Crew'

        when: "I create a breadcrumb from it"
        def eventCrumb = eventController.createCrumb("Event", "show", "1", event.title)

        /*
        private Map createCrumb (String controllerName, String actionName, String id, String msg) {
        msg = (msg ? msg : "cr.breadcrumb.${controllerName}.${actionName}")
        [ 'controller':controllerName,
        'action':actionName,
        'id':id,
        'message':msg
        ]
         */

        then: "I receive a map where the message-value is the events' title"
        eventCrumb.message == event.title
    }
}

note the commented out method which is in the EventController

  1. Why does the snippet cause "Cannot get property 'message' on null object"?
  2. How can I setup the snippet correctly?
  3. Generally, will/won't I need any of the mockTagLib, mockController, mockLogging GrailsUnitTestCase functions when using Spock?

回答1:


If you are unit testing a controller there is a convention which automatically sets the controller up for you. Just refer to the controller in your test as follows;

import grails.plugin.spock.*

class EventControllerSpec extends ControllerSpec {

  def "Creating a breadcrumb from an event"() {
    given: "I have a named event"
    def event = Mock(Event)
    event.title >> 'Space-Journey with Sprock and the Crew'

    when: "I create a breadcrumb from it"
    def eventCrumb = controller.createCrumb("Event", "show", "1", event.title)

    /*
    private Map createCrumb (String controllerName, String actionName, String id, String msg) {
    msg = (msg ? msg : "cr.breadcrumb.${controllerName}.${actionName}")
    [ 'controller':controllerName,
    'action':actionName,
    'id':id,
    'message':msg
    ]
     */

    then: "I receive a map where the message-value is the events' title"
    eventCrumb.message == event.title
  }
}

You don't need to explicitly mock the controller as ControllerSpec does it for you, however, you may need to mock other elements that your controller is using. Sometimes it is sufficient to add these through the controller's metaclass



来源:https://stackoverflow.com/questions/4671828/why-is-this-method-returning-null-even-though-the-underlying-controller-is-mocke

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!