问题描述
我已经为此战斗了好几天。该模拟将不会返回SUCCESS
(正确):1 * realtimeClient.send(_) >> SUCCESS
。
在question 41841668中,我发现需要1 *
,但我添加后没有成功。我正在打印realtimeClient.send()
结果的中间变量,它始终为false。
RealtimeClient
和QueueClient
是接口。我尝试使用具体的类对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(_)
}