Java Spock框架中的Mocking

Java Spock框架中的Mocking,java,testing,groovy,mocking,spock,Java,Testing,Groovy,Mocking,Spock,我试着用Spock编写测试,但遇到了一些问题。 代码会告诉你更多。。。我的测试看起来像: class MyServiceSpec extends Specification { private MyService myService private MyDAO myDAO def setup() { myDAO = Mock(MyDAO) myService = new MyServiceImpl(myDAO) } de

我试着用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
是一个
接口


我还尝试了不同的
设置
方法:

    def setup() {
        myDAO = Mock(MyDAO) {
            getUsersSomethingFromDate(_ as User, _ as LocalDate) >> [ Mock(Something) ]
        }
        myService = new MyServiceImpl(myDAO)
    }
尽管我声明方法
getUsersSomethingFromDate
应该返回
[Mock(Something)]
,但它返回
null
。在下一次服务方法运行中,我收到了
NullPointerException
,因为返回的是“null”,而不是模拟实例列表。
问题是,为什么声明了返回值的mock对象仍然返回
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) ]
}

请参见选中的

。它是有效的。在某些方面,斯波克不是那么直观…:)Wired think is Spock允许使用
Mock(class){something()>>“something”}
并且Mock将返回“something”,但是如果我们使用
1*something
它将返回
null
,如果
块中未指定返回,则:
块。