Spock 模拟不会 return 正确的值

Spock mock won't return correct value

我已经为此奋斗了好几天。这个 mock 不会 return SUCCESS (true): 1 * realtimeClient.send(_) >> SUCCESS。 从 我发现我需要 1 *,但我添加了它但没有成功。我正在打印 realtimeClient.send() 结果的中间变量,它始终为 false。

RealtimeClientQueueClient 是接口。我尝试使用具体的 classes 对 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(_)
    }

控制器 class 精简为一个基本示例,看起来像

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,如果您模拟某些内容并需要 return 一个值,则必须同时进行。因此,如果您将 given 块中的行 1 * realtimeClient.send(_) >> SUCCESS 合并到 then 块中,那么它 return 就是您期望的值。

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(_)
}