groovy - 使用 Spock 验证非 spy 方法调用

标签 groovy java-8 mocking spock stub

我想使用spock来查找类中的方法是否被调用。但是当我尝试验证它时,when block 表示该方法从未被调用。

public class Bill {
    public Bill(Integer amount) {
        this.amount = amount;

    }
    public void pay(PaymentMethod method) {
        Integer finalAmount = amount + calculateTaxes();
        method.debit(finalAmount);
    }

    private Integer calculateTaxes() {
        return 0;
    }

    private final Integer amount;
}

public class PaymentMethod {

    public void debit(Integer amount) {
        // TODO
    }

    public void credit(Integer amount) {
        // TODO
    }
}

import spock.lang.Specification
import spock.lang.Subject

class BillSpec extends Specification {
    @Subject
    def bill = new Bill(100)

    def "Test if charge calculated"() {
        given:
        PaymentMethod method = Mock()
        when:
        bill.pay(method)
        then:
        1 * method.debit(100)
        // 1 * bill.calculateTaxes() // Fails with (0 invocations) error
        0 * _
    }
}

在上面的示例中,我想做的就是验证是否正在调用calculateTaxes,但测试失败(0 次调用)。我尝试使用 spy ,但不确定语法是什么,因为 Bill 采用参数化构造函数。

最佳答案

当您监视 Bill 实例时,您可以测试 calculateTaxes() 调用,如下所示:

class SpyTestSpec extends Specification {
    def "Test if charge calculated"() {
        given:
        def bill = Spy(new Bill(100))
        PaymentMethod method = Mock()

        when:
        bill.pay(method)

        then:
        1 * method.debit(100)
        1 * bill.calculateTaxes()
        1 * bill.pay(method)
        0 * _
    }
}

另一件重要的事情是使 calculateTaxes() 方法对测试可见,否则它仍然会失败:

public Integer calculateTaxes() { ... }

请注意,如果您想测试是否没有调用任何其他内容,那么您还应该添加:

1 * bill.pay(method)

结果如下: enter image description here

关于groovy - 使用 Spock 验证非 spy 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55276738/

相关文章:

groovy - 如何使用 Gremlin 查找也关注我的关注者

java - 如何将流的结果收集到 Java 8 中的自定义对象数组中

c# - 如何模拟代码优先策略创建的 Entity Framework 数据库?

java - 如何将一个 Gradle 脚本导入另一个?

groovy - 是否有某种方法可以对不存在的对象使用安全空运算符?

hibernate - Grails条件在集成测试中不起作用

java - 递归取消 allOf CompletableFuture

java - 如何在java.time.Instant中获取和设置指定时间?

php - 仅断言模拟调用的单元测试

ruby-on-rails - 使用Mocha模拟/ stub Application Controller方法(使用Shoulda,Rails 3)