Загрузка тестовых свойств application.yml

У меня есть файл тестовых свойств под src/test/resources/application.yml. Но я не могу получить значения для загрузки в модульном тесте. У меня следующий класс:

@ConfigurationProperties("snmp")
open class SnmpProperties {

    var port: Int = 1611
    lateinit var protocol: String
    lateinit var host: String

    override fun toString(): String {
        return "SnmpProperties(port=$port, protocol='$protocol', host='$host')"
    }
}

который в производственном коде загружает значения из /src/main/resources/application.yml.

snmp:
  port: 1161
  protocol: udp
  host: 0.0.0.0

Класс модульного теста:

@CamelSpringBootTest
@SpringBootApplication
@EnableAutoConfiguration
open class SnmpRouteTest : CamelTestSupport() {

    @Autowired
    lateinit var snmpProperties: SnmpProperties

    @Mock
    lateinit var repository: IPduEventRepository

    @InjectMocks
    lateinit var snmpTrapRoute: SnmpTrapRoute

    @Before
    fun setup() {
        initMocks(this)
    }

Я попытался добавить профиль test к каждому application.yml файлам, чтобы увидеть, работает ли это добавление @ActiveProfiles("test"), но этого не произошло.

src / main / resources / application.yml и src / test / resources / application.yml

# Test profile
spring:
  profiles: test
snmp:
  port: 1161
  protocol: udp
  host: 0.0.0.0

Я также создал класс TestConfiguration, который создает bean-компонент SnmpProperties и автоматически подключает его к классу тестирования с помощью @EnableConfigurationProperties(TestConfiguration::class):

@Configuration
@EnableConfigurationProperties(SnmpProperties::class)
open class TestConfiguration {

    @Bean
    open fun snmpProperties() = SnmpProperties()
}

Опять же, нет. Я получаю следующее сообщение об ошибке:

Cannot instantiate @InjectMocks field named 'snmpTrapRoute' of type 'class org.meanwhile.in.hell.camel.snmp.receiver.route.SnmpRoute'.
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : Parameter specified as non-null is null: method org.meanwhile.in.hell.camel.snmp.receiver.route.SnmpTrapRoute.<init>, parameter snmpProperties

person MeanwhileInHell    schedule 11.11.2019    source источник
comment
вы можете переопределить данные, которые вы хотите использовать в тестовом профиле, и поместить их в application-test.yml!   -  person TinyOS    schedule 11.11.2019
comment
Вот что я пробовал. Я обновил свой вопрос, чтобы прояснить это.   -  person MeanwhileInHell    schedule 11.11.2019
comment
попробуйте увидеть это: tuhrig.de/testing-configurationproperties-in-spring-boot или stackoverflow.com/a/31748450/4373948   -  person TinyOS    schedule 11.11.2019
comment
Как вы решили эту проблему?   -  person D.B    schedule 09.11.2020
comment
@ D.B Я добавил свой переписанный модульный тест в качестве ответа ниже. Его особенность верблюда. Вместо загрузки тестовых свойств я заменил реальный маршрут фиктивным маршрутом, поэтому рабочие свойства загружались как обычно. Мне потребовалось время, чтобы понять это, но я надеюсь, что это поможет.   -  person MeanwhileInHell    schedule 20.11.2020


Ответы (2)


Обязательно проверьте структуру своего проекта. Файл свойств должен находиться в пути к классам, чтобы Spring Boot мог его найти и использовать. Например, структура проекта, определенная Maven здесь: https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

В случае Maven ваши файлы конфигурации должны быть помещены в эти каталоги:

src/main/resources/application.yml
src/test/resources/application.yml
person Pieterjan Deconinck    schedule 11.11.2019
comment
Извините, я ошибся в своем вопросе относительно истинного пути к моим файлам YML. Поправил макет. - person MeanwhileInHell; 11.11.2019

Похоже, что bean-компонент не создан (отсюда и нулевая ошибка).

Попробуйте либо:

  • добавьте @Configuration поверх вашего класса конфигурации SnmpProperties
  • добавьте @EnableConfigurationProperties(SnmpProperties.class) поверх тестового класса

Источник: https://www.baeldung.com/configuration-properties-in-spring-boot

person Pieterjan Deconinck    schedule 11.11.2019