У меня есть класс, который внедряется со свойствами application.yaml
, расположенными в каталоге src/main/resources
. Я написал тест, который утверждает, что эти свойства вводятся как ожидалось. Тест работает нормально, но он использует файл application.yaml
из src/main/resources
.
Я хочу, чтобы он использовал файл test-application.yaml
из src/test/resources
для использования некоторых фиктивных значений.
Я следовал многим руководствам и прочитал много вопросов здесь, на Stackoverflow, но не смог заставить ни один из этих подходов работать. Возможно, потому что я перепутал аннотации к другому решению или что-то в этом роде.
Status Quo
Я использую версии пружин, предоставляемые системой управления пружинами
id("io.spring.dependency-management") version "1.0.9.RELEASE"
Редактировать : Также я использую следующие соответствующие зависимости:
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-webflux")
Файл свойств src/main/resources/application.yaml
:
controlroom:
ftpConnections:
foo-importer:
host: ftp.stage.company.com
port: 22
user: foo-ftp
password: password
bar-importer:
host: ftp.stage.company.com
port: 22
user: bar-ftp
password: password
Это класс держателя конфигурации свойств:
@Configuration
@ConfigurationProperties(prefix = "controlroom")
class FtpConnectionsProvider(
) {
lateinit var ftpConnections: Map<String, Map<String, String>>
}
И это тестовый класс, который в настоящее время внедряет свойства из main/resources/application.yaml
:
@ExtendWith(SpringExtension::class)
@SpringBootTest
internal class FtpConnectionsProviderTest(
@Autowired
val ftpConnectionsProvider: FtpConnectionsProvider
) {
@Test
fun `should fill FtpConnectionsProvider with properties from yaml`() {
assertThat(ftpConnectionsProvider.ftpConnections["foo-importer"]).containsAllEntriesOf(
mapOf(
"host" to "ftp.stage.company.com",
"port" to "22",
"user" to "foo-ftp",
"password" to "password"
))
assertThat(ftpConnectionsProvider.ftpConnections["bar-importer"]).containsAllEntriesOf(
mapOf(
"host" to "ftp.stage.company.com",
"port" to "22",
"user" to "bar-ftp",
"password" to "password"
))
}
}
Как использовать test-application.yaml?
Теперь мне интересно, как Я могу дать тесту инструкцию использовать только src/test/resources/test-application.yaml
.
Первая попытка
@ExtendWith(SpringExtension::class)
@SpringBootTest
@TestPropertySource("classpath:test-application.yaml")
internal class FtpConnectionsProviderTest
Результат : Просто игнорирует его и продолжает использовать src/main/resources/application.yaml
Вторая попытка
Люди говорят, что @TestPropertySource
не может прочитать .yaml
файлы, и поэтому я добавил аннотацию @ContextConfiguration
, так как это было предлагаемое исправление.
@ExtendWith(SpringExtension::class)
@SpringBootTest
@TestPropertySource("classpath:test-application.yaml")
@ContextConfiguration(initializers=[ConfigFileApplicationContextInitializer::class])
internal class FtpConnectionsProviderTest
Результат : Просто игнорирует его и продолжает использовать src/main/kotlin/resources/application.yaml
Кажется, ничего не работает. Я не gr asp почему это так важно и почему так сложно найти решение