Как правильно смоделировать декларативный клиент REST при модульном тестировании службы Grails?
Подробности
Я использую декларативный HTTP-клиент Micronaut в моих Grails 4 приложение.
Я попытался выполнить модульное тестирование клиента с помощью Ersatz, но не смог заставить его работать через несколько дней: Как настроить Micronaut @Client в среде тестирования Grails?
Теперь я пытаюсь провести модульное тестирование службы, которая использует его, используя стандартный подход для имитации зависимостей:
class MyServiceSpec extends Specification implements
ServiceUnitTest<MyService> {
MyRestClient myRestClient = Mock()
def setup() {
service.myRestClient = myRestClient
}
...
}
Это дает мне NoSuchBeanDefinitionException
.
Методом проб и ошибок я обнаружил, что декларативный клиент не работает с def myRestClient
, как другие бины Grails. Это должно быть @Autowired
.
at org.grails.testing.GrailsUnitTest$Trait$Helper.defineBeans(GrailsUnitTest.groovy:99)
at grails.testing.services.ServiceUnitTest$Trait$Helper.mockArtefact(ServiceUnitTest.groovy:58)
at org.grails.testing.ParameterizedGrailsUnitTest$Trait$Helper.getArtefactInstance(ParameterizedGrailsUnitTest.groovy:48)
at grails.testing.services.ServiceUnitTest$Trait$Helper.getService(ServiceUnitTest.groovy:85)
at com.mycompany.MyServiceSpec.setup(MyServiceSpec.groovy:##)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mycompany.MyRestClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1662)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1221)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:595)
... 15 more