Grails/Spock测试为服务提供了存根实现

Grails/Spock测试为服务提供了存根实现,grails,testing,spock,Grails,Testing,Spock,目前,我有一个Grails服务,它实际上向AMQP提供者发布消息。我想通过替换publish方法来存根消息发布,这样它就不会发布到AMQP,而是将消息存储在列表中 例如: class AService { EventPublisherService eventPubliserService def createSomething() { eventPublisherService.publishEvent(..) } } 有没有办法在集成测试中存根“cr

目前,我有一个Grails服务,它实际上向AMQP提供者发布消息。我想通过替换publish方法来存根消息发布,这样它就不会发布到AMQP,而是将消息存储在列表中

例如:

class AService {
    EventPublisherService eventPubliserService
    def createSomething() {
        eventPublisherService.publishEvent(..)
    }
}

有没有办法在集成测试中存根“createSomethingMethod”,以便我以后可以在列表中检查已发布的事件?

您可以使用闭包映射模拟
eventPublisherService
,其中键是被模拟的方法的名称。然后在闭包中,您可以测试传递的消息列表。之后恢复服务,使其不影响其他测试

class AServiceTests extends GroovyTestCase {

    def aService
    def eventPublisherService

    @After
    protected void tearDown() {
        super.tearDown()
        aService.eventPublisherService = eventPublisherService
    }

    void testSomething() {
        aService.eventPublisherService = [publishEvent: { messages ->
            assert messages.size() == 5
            // etc.
        }]

        // continue testing
    }
}

为什么只替换publishEvent()方法而不是整个EventPublisherService对象?