Запуск модульного теста контроллера работает в IntelliJ, но без использования приложения grails test
Я сталкиваюсь с небольшой проблемой, с которой я не знаю, как ее решить. В моем текущем приложении мы используем RabbitMQ в качестве брокера AMQP (с использованиемspring-rabbit) и успешно написали интеграционные тесты, в которых RabbitMQ ConnectionFactory автоматически подключается и т. Д.
Теперь у нас также есть несколько модульных тестов для небольшого контроллера, которые выдают ошибку при запуске из командной строки.grails test-app
org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем rabbitMQConfig: ошибка внедрения зависимостей с автопроводкой; вложенным исключением является org.springframework.beans.factory.BeanCreationException: не удалось автоматически связать поле: private org.springframework.amqp.rabbit.connection.ConnectionFactory rabbitmq.config.RabbitMQConfig.connectionFactory; вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: для зависимости не найдено подходящего bean-компонента типа [org.springframework.amqp.rabbit.connection.ConnectionFactory]: ожидается, что по крайней мере 1 bean-компонент, который квалифицируется как кандидат для автоматической передачи этой зависимости. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(обязательно =true)}
Когда я запускаю Unit Test внутри IntelliJ, все работает отлично!
Поэтому мне интересно, в чем разница между выполнением тестов внутри IntelliJ и командной строкой Grails. Я предполагаю, что это имеет какое-то отношение к средам, в которых Grails запускает тест. Но мы также подключили RabbitMQTestConfig, чтобы интеграционные тесты работали с тестовой конфигурацией.
Я немного озадачен тем, почему это работает внутри IntelliJ, а не в командной строке. Любая подсказка?
2 ответа
Когда вы говорите "запустить модульный тест внутри IntelliJ", вы имеете в виду запускать тестовую задачу Gradle (поскольку вы используете Grails 3)?
Вы можете попытаться определить вашу ложную инъекцию с помощью doWithSpring в вашей спецификации:
// define the mock or the object instance you want
ConnectionFactory connectionFactory = Mock(ConnectionFactory)
def doWithSpring = {
connectionFactory(InstanceFactoryBean, connectionFactory, ConnectionFactory)
}
Если это не решение, вы можете попробовать очистить перед повторным тестированием