Файл конфигурации профилей YAML Spring Boot - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь протестировать YAML-профили с помощью Spring Boot. Следующий файл yaml-props.yml является моим файлом конфигурации:

name: def
---
spring:
   profiles: live
   name: live
---
spring:
   profiles: test
   name: test

Кроме того, я установил для свойства spring.profiles.active значение live внутри application.properties файла (оба файла конфигурации находятся в папке src/test/resources). ) Наконец, вот мой тестовый класс:

@SpringBootTest
@TestPropertySource("classpath:yaml-props.yml")
public class YMLUnitTest {

    @Autowired
    private YMLProps ymlProps;

    @Autowired
    private Environment env;

    @Test
    public void testYmlProps() {

        assertEquals("live", env.getActiveProfiles()[0]); // Active profile is 'live'
        assertEquals("live", ymlProps.getName()); // Fails here!
    }
}

Однако во втором утверждении тест не пройден:

org.opentest4j.AssertionFailedError: expected: <live> but was: <test>

Кажется, что Spring выбирает последний определенный профиль. Почему это происходит?

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Попробуйте добавить следующее после @SpringBootTest.

@SpringBootTest(value={"spring.profiles.active=live"})

Надеюсь, это сработает!

0 голосов
/ 04 марта 2020

Прежде всего, ваш файл конфигурации неверен (обратите внимание на отступ), оно должно быть:

name: def
---
spring:
  profiles: live
name: live
---
spring:
  profiles: test
name: test

Вторая проблема заключается в том, что вы не можете использовать файлы YAML везде, где вы можете используйте файлы свойств, и @TestPropertySource - это тот случай, когда вы не можете просто использовать YAML-файл ...

Если вы используете application.yml, это просто, но может сбить с толку. Если вы хотите использовать несколько файлов YAML, я бы порекомендовал вам использовать -Dspring.config.additional-location=classpath:yaml-props.yml.

Вот мой pom. xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>betlista</groupId>
    <artifactId>springTests-springBootTest</artifactId>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.2.5.RELEASE</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Класс YMLProps

package betlista.springTests.springBootTest;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties
public class YMLProps {

    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Класс YMLUnitTest

package betlista.springTests.springBootTest;

import betlista.springTests.springBootTest.YMLProps;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test,live")
public class YMLUnitTest {

    @Autowired
    private YMLProps ymlProps;

    @Autowired
    private Environment env;

    @Test
    public void testYmlProps() {
        String[] activeProfiles = env.getActiveProfiles();
        Assert.assertEquals("live", activeProfiles[1]); // Active profile is 'live'
        Assert.assertEquals("live", ymlProps.getName()); // Fails here!
    }

}

Все доступно на GitHub: https://github.com/Betlista/SpringTests/tree/master/YMLProps

0 голосов
/ 21 января 2020

из документации Spring

Документы YAML объединяются в том порядке, в котором они встречаются. Более поздние значения переопределяют более ранние значения.

Вы должны контролировать профиль, который хотите использовать, т.е. --spring.profiles.active=live

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