Проверка нешпионских вызовов методов с помощью Спока - PullRequest
2 голосов
/ 21 марта 2019

Я хочу использовать spock, чтобы узнать, был ли вызван метод в классе.Но когда я пытаюсь это проверить, блок when говорит, что метод никогда не вызывался.

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 * _
    }
}

В приведенном выше примере все, что я хочу сделать, этопроверьте, вызывается ли метод convertTaxes, но проверка завершается с ошибкой (0 вызовов).Я пытался использовать шпион, но не уверен, какой будет синтаксис, поскольку Билл принимает параметризованный конструктор.

1 Ответ

3 голосов
/ 21 марта 2019

Вы можете проверить calculateTaxes() вызов, когда вы шпионите за экземпляром Bill, например:

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

...