Как издеваться над аннотированным классом? - PullRequest
1 голос
/ 29 марта 2019

Как можно аннотировать класс (или подсмотреть) в Споке, чтобы можно было утверждать логику, основанную на аннотации?

Придуманный пример в Groovy (может быть и на Java) показывает метод, который проверяет конкретное значение аннотации в коллекции объектов. Представьте себе более сложную логику, выполняемую после фильтрации по аннотации, которую я хотел бы утверждать с помощью насмешливых объектов в коллекции.

@FooAnnotation('FOOBAR')
class MainGroovy {
    def findFOOBARs(Object... candidates) {
        candidates.findAll{ it.class.getAnnotation(FooAnnotation)?.value() == 'FOOBAR' }
        //Do something with the filtered objects.
    }
}

Передача шпиона не проходит фильтр аннотаций, поэтому ни о какой последующей логике нельзя утверждать.

@Unroll
def test() {
    given:
        def foobars = mg.findFOOBARs(mg, new Object(), 'STRING')
    expect:
        foobars.size() == 1
    where:
        mg << [new MainGroovy(), Spy(MainGroovy)]
}

1 Ответ

1 голос
/ 30 марта 2019

Возможно, я чего-то не знал, но я провел быстрое исследование этого варианта использования. Похоже, что невозможно сохранить аннотации от ложных / шпионских классов, используя Mock или Spy Спока. Если мы посмотрим, как Spock создает макеты / шпионы класса при использовании byte-buddy, мы увидим, что он подклассов исходного типа. Если мы посмотрим глубже, как работает byte-buddy по умолчанию, то увидим, что он не сохраняет аннотации исходного типа, если не настроено иначе. По умолчанию он просто использует фабрику по умолчанию InstrumentedType с методом подкласса , игнорируя сохранение аннотаций .

Я еще не нашел проблем, связанных с сохранением аннотаций на GitHub Спока. Исправление на стороне Спока может выглядеть довольно тривиально, но я не уверен в этом. Лучше спросить на их GitHub.

Как довольно уродливый обходной путь для простых случаев, вы можете попробовать Mockito spy / mock в спецификации Спока

...