目前,我有一个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
    }
}

10-07 12:48