Byte-buddy и cglib недоступны в тесте Спока - PullRequest
1 голос
/ 01 июня 2019

Я начал играть со средой тестирования Спока, и мой раздел build.gradle зависимостей выглядит так:

dependencies {
    testCompile "org.spockframework:spock-core:1.3-groovy-2.5"
}

У меня есть (бесполезный) тест Спока, который требует создания заглушки:

def 'A test that will fail'() {
    given: ''
    def random = Stub(Random)
}

При запуске тест не пройден с указанной ошибкой:

CannotCreateMockException: невозможно создать макет для класса java.util.Random. Пересмешивание неинтерфейсных типов требует библиотеки генерации кода. Пожалуйста, поместите последнюю версию byte-buddy или cglib-nodep в путь к классу.

Эта ошибка упоминается в документации Спока и вызвана тем, что cglib или byte-buddy недоступны во время выполнения.

Учитывая, что pom спока-ядра перечисляет и byte-buddy, и cglib как зависимости компиляции , почему они не сохраняются во время выполнения? Другими словами, зачем нам явно добавлять следующую зависимость времени выполнения в наш файл build.gradle?

testRuntime "net.bytebuddy:byte-buddy:1.9.3" 

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Это необязательные зависимости, поэтому их нужно включить, если вы хотите эту функциональность

https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html

1 голос
/ 01 июня 2019

Поскольку оба ( byte-buddy и cglib-nodep ) помечены как <optional>true</optional>, где с точки зрения Gradle они являются compileOnly зависимостями - см .: https://blog.gradle.org/introducing-compile-only-dependencies

Зависимости только для компиляции заметно отличаются от обычных компилировать зависимости. Они не включены в путь к классам во время выполнения и они не являются переходными, то есть они не включены в зависимые проекты.

...