在 Spock 框架中模拟

Mocking in Spock framework

我尝试用 Spock 编写测试,但遇到了一些问题。 代码会告诉更多......我的测试看起来像:

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 是一个 interface

我也尝试了不同的 setup 方法:

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

尽管我声明方法 getUsersSomethingFromDate 应该 return [ Mock(Something) ],但它 return 应该 null。在下一个服务方法 运行 中,我收到了 NullPointerException,因为 returned 'null' 而不是模拟实例列表。 问题是为什么声明值为 return 的模拟对象仍然 returns null?

mock 与调用计数检查相结合时出现问题,因为 mock 不会被调用。

您可以用这种方式重写组合测试以使其正常工作:

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) ]
}

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