Не удается загрузить файл test-properties.yaml с @TestPropertySource с Spring Boot, JUnit5 и Kotlin - PullRequest
1 голос
/ 07 марта 2020

У меня есть класс, который внедряется со свойствами 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 почему это так важно и почему так сложно найти решение

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Вы пытались поместить файл application.yaml в src/test/kotlin/resources? Это должно работать без каких-либо специальных настроек / аннотаций.

Кроме того, если вы хотите иметь / переопределить определенные свойства в файле yaml с именем testfoo, вы можете поместить эти реквизиты в application-testfoo.yaml в том же каталоге. и файл будет использоваться при активации профиля testfoo Spring.

Пример:

src/test/kotlin/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

src/test/kotlin/resources/application-testfoo.yaml:

controlroom:
  ftpConnections:
    foo-importer:
      user: test-foo-ftp

Если вы активируете профиль testfoo, controlroom.ftpConnections.foo-importer.user будет переопределен. Это то, что вы хотите?

В качестве альтернативы, в качестве еще более простого решения, если вы просто хотите заменить пару своих производственных значений: вообще не создавайте src/test/kotlin/resources/application.yaml. Просто создайте src/test/kotlin/resources/application-testfoo.yaml, и он должен переопределить значения из src/main/kotlin/resources/application.yaml (при условии, что профиль testfoo активен)! Это работает в Java с моим applications.properties в любом случае - я не вижу причин, почему он должен работать по-другому в Kotlin.

1 голос
/ 07 марта 2020

Вы не можете загрузить файл yaml, используя @TestPropertySource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...