Search code examples
javatestinggroovymockingspock

Mocking in Spock framework


I tried to write test in Spock, but I have some problems. Code will tell more... My tests looks like:

class MyServiceSpec extends Specification {
    private MyService myService
    private MyDAO myDAO

    def setup() {
        myDAO = Mock(MyDAO)
        myService = new MyServiceImpl(myDAO)
    }

    def "Should get something"() {
        given:
        def user = Mock(User)
        def date = now()
        myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]

        when:
        myService.getUsersSomethingFromDate(user, date)

        then:
        1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate)
    }
}

MyDAO is an interface.

I also tried different setup method:

    def setup() {
        myDAO = Mock(MyDAO) {
            getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
        }
        myService = new MyServiceImpl(myDAO)
    }

Despite I declared that method getUsersSomethingFromDate should return [ Mock(Something) ], it returns null. In the next service method run I received NullPointerException, because returned 'null' instead of list of mocked instance. The question is why mocked object with declared value to return still returns null?


Solution

  • There is a problem in combining of mocking with invocation count checking, because mock is not called then.

    You can rewrite your combined test in this way to have it working:

    def "Should get something"() {
            given:
            def user = Mock(User)
            def date = now()
    
            when:
            myService.getUsersSomethingFromDate(user, date)
    
            then:
            1 * myDAO.getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
    }
    

    See http://spockframework.org/spock/docs/1.3/all_in_one.html#_combining_mocking_and_stubbing