Проверка доступа к свойству абстрактного или конкретного класса в Споке - PullRequest
0 голосов
/ 04 мая 2020

Когда я макетирую абстрактный или конкретный класс с парой получатель / установщик и затем получаю доступ к свойству, соответствующий вызывающий / установщик никогда не вызывается. Тем не менее, это работает нормально, если Mock создан для интерфейса. В приведенном ниже коде есть 3 набора по два теста в каждом (один получатель тестирования, а другой установщик), и они идентичны, за исключением того, что они насмехаются. Первый набор работает нормально, потому что они тестируют на интерфейсе, но следующие два набора не делают:

import spock.lang.Specification

interface Foo {
    public String getProp();
    public void setProp(String val);
}
abstract class FooBase implements Foo {
    public abstract String getProp();
    public abstract void setProp(String val);
}
class FooImpl extends FooBase {
    public String getProp() {
        println('Foo.getProp')
        return null
    }

    public void setProp(String val) {
        println('Foo.setProp')
    }
}
class TestPropertyAccess extends Specification {
    def 'test setter on interface'() {
        given:
            def foo = Mock(Foo)
        when:
            foo.prop = 'val'
        then:
            1 * foo.setProp(_)
    }

    def 'test getter on interface'() {
        given:
            def foo = Mock(Foo)
        when:
            foo.prop
        then:
            1 * foo.getProp()
    }

    def 'test setter on abstract'() {
        given:
            def foo = Mock(FooBase)
        when:
            foo.prop = 'val'
            //foo.setProp('val')
        then:
            1 * foo.setProp(_)
            //1 * foo.setProperty('prop', 'val')
    }

    def 'test getter on abstract'() {
        given:
            def foo = Mock(FooBase)
        when:
            foo.prop
            //foo.getProp()
        then:
            1 * foo.getProp()
            //1 * foo.getProperty('prop')
    }

    def 'test setter on concrete'() {
        given:
            def foo = Mock(FooImpl)
        when:
            foo.prop = 'val'
            //foo.setProp('val')
        then:
            1 * foo.setProp(_)
            //1 * foo.setProperty('prop', 'val')
    }

    def 'test getter on concrete'() {
        given:
            def foo = Mock(FooImpl)
        when:
            foo.prop
            //foo.getProp()
        then:
            1 * foo.getProp()
            //1 * foo.getProperty('prop')
    }
}

Я могу заставить сработавшие тесты работать, если я замените доступ к свойству соответствующим геттером / сеттером или, если я проверю универсальный c getProperty / setProperty.

Я что-то упустил или это может быть ошибкой?

1 Ответ

1 голос
/ 06 мая 2020

Хороший улов! Я бы посчитал это ошибкой Спока, учитывая тот факт, что

  • тот же код работает с нотацией свойства точки при вызове из обычной программы Groovy, если вы добавляете реальное свойство и устанавливаете установщик и получатель получает его,
  • тест ведет себя по-разному в предварительном просмотре Spock 1.3 и 2.0 (там тесты геттера работают, только тесты установщика терпят неудачу).

Возможно, что-то не так * ** обработал преобразование AST, генерирующее реальный код из DSL Spock во время компиляции.

Я только что открыл тикет об ошибке # 1158 от вашего имени.


Обновление: На самом деле я только что заметил, что если классы приложений реализованы в Java, они работают как положено, но тогда, конечно, вы не можете использовать методы {get|set}Property, потому что они определены только в GroovyObject s.

...