Spock模拟无法返回正确的值

问题描述

我已经为此战斗了好几天。该模拟将不会返回SUCCESS(正确):1 * realtimeClient.send(_) >> SUCCESS。 在question 41841668中,我发现需要1 *,但我添加后没有成功。我正在打印realtimeClient.send()结果的中间变量,它始终为false。

RealtimeClientQueueClient是接口。我尝试使用具体的类对RestfulEmailController和Spock测试进行编码,但行为没有变化。我尝试使用大Boolean而不是小boolean,没有变化。文档说这应该可行,而问题41841668说这应该可行(尽管示例代码不完整)。

public static final boolean SUCCESS = true

def "test real time email success"() {
        given:
        RealtimeClient realtimeClient = Mock()
        QueueClient queueClient = Mock()

        1 * realtimeClient.send(_) >> SUCCESS

        RestfulEmailController restfulEmail = new RestfulEmailController(realtimeClient: realtimeClient,queueClient: queueClient)

        RestfulEmailContract email = new RestfulEmail(subject: "some subject")

        when:
        restfulEmail.sendRestfulEmail(email)

        then:
        1 * realtimeClient.send(_)
        0 * queueClient.send(_)
    }

和简化为基本示例的控制器类如下

void sendRestfulEmail(@RequestBody RestfulEmail emailRequest) {
            boolean success = realtimeClient.send(emailRequest)
            System.out.println("success = " + success )
            if (!success ) {
                queueClient.send(emailRequest)
            }
    }

我无能为力,使系统显示“ success = true”,并且我对0 * queueCient.send(_)的期望达不到要求

解决方法

请参阅文档中的Combining Mocking and Stubbing,如果您模拟某些内容并需要返回一个值,则必须同时进行操作。因此,如果您将1 * realtimeClient.send(_) >> SUCCESS块中的行given合并到then块中,那么它将返回您期望的值。

def "test real time email success"() {
    given:
    RealtimeClient realtimeClient = Mock()
    QueueClient queueClient = Mock()
    RestfulEmailController restfulEmail = new RestfulEmailController(realtimeClient: realtimeClient,queueClient: queueClient)
    RestfulEmailContract email = new RestfulEmail(subject: "some subject")

    when:
    restfulEmail.sendRestfulEmail(email)

    then:
    1 * realtimeClient.send(_) >> SUCCESS
    0 * queueClient.send(_)
}