在SpringBoot Test中加载不同的application.yml

时间:2016-08-02 04:39:28

标签: spring-mvc spring-boot

我正在使用一个运行我的src / main / resources / config / application.yml的Spring启动应用程序。

当我运行我的测试用例时:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class MyIntTest{
}

测试代码仍然运行我的application.yml文件来加载属性。 我想知道在运行测试用例时是否可以运行另一个* .yml文件。

11 个答案:

答案 0 :(得分:50)

一种选择是使用配置文件。创建一个名为 application-test.yml 的文件,将这些测试所需的所有属性移动到该文件,然后将@ActiveProfiles注释添加到测试类中:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@ActiveProfiles("test") // Like this
public class MyIntTest{
}

请注意,它还会加载application-test.yml,因此application.yml中的所有属性仍然会被应用。如果您不想要,也可以使用配置文件,或者在application-test.yml中覆盖它们。

答案 1 :(得分:15)

您可以在src/test/resources/config/application.yml文件中设置测试属性。 Spring Boot测试用例将从测试目录中的application.yml文件中获取属性。

答案 2 :(得分:14)

您可以使用 @TestPropertySource 加载不同的属性/ yaml文件

@TestPropertySource(locations="classpath:test.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class MyIntTest{

}

如果您想覆盖,只能使用特定属性/ yaml

@TestPropertySource(
        properties = {
                "spring.jpa.hibernate.ddl-auto=validate",
                "liquibase.enabled=false"
        }
)

答案 3 :(得分:4)

请参阅:Spring @PropertySource using YAML

我认为第3个答案有你正在寻找的东西,即有一个单独的POJO将你的yaml值映射到:

@ConfigurationProperties(path="classpath:/appprops.yml", name="db")
public class DbProperties {
    private String url;
    private String username;
    private String password;
...
}

然后使用以下方法注释您的测试类:

@EnableConfigurationProperties(DbProperties.class)
public class PropertiesUsingService {

    @Autowired private DbProperties dbProperties;

}

答案 4 :(得分:4)

如果您需要完全替换生产application.yml,则将其测试版本放到相同的路径,但要处于测试环境中(通常是src/test/resources/

但是,如果您需要覆盖或添加一些属性,那么选择就少了。

选项1:按照@TheKojuEffect在其answer中的建议,将测试application.yml放在src/test/resources/config/目录中。

选项2:使用profile-specific properties:在您的application-test.yml文件夹中创建说src/test/resources/,然后:

  • 在测试类中添加@ActiveProfiles注释:

    @SpringBootTest(classes = Application.class)
    @ActiveProfiles("test")
    public class MyIntTest {
    
  • 或在spring.profiles.active批注中设置@SpringBootTest属性值:

    @SpringBootTest(
            properties = ["spring.profiles.active=test"],
            classes = Application.class,
    )
    public class MyIntTest {
    

这不仅适用于@SpringBootTest,而且还适用于@JsonTest@JdbcTests@DataJpaTest和其他切片测试注释。

您可以根据需要设置任意数量的配置文件(spring.profiles.active=dev,hsqldb-在Profiles上的文档中查看更多详细信息。

答案 5 :(得分:3)

Spring-boot 框架允许我们提供 YAML 文件来替代 .properties文件,这很方便。属性文件可以在资源文件夹中的 application.yml 文件中以YAML格式提供,spring-boot将自动将其取出。请记住,yaml格式必须保持空格正确的值要正确阅读。

您可以使用@Value("${property}")注入YAML文件中的值。 此外,还可以给出 Spring.active.profiles ,以区分不同环境的不同YAML,以便于部署。

出于测试目的 ,测试yaml文件可以是 application-test.yml 之类的名称,并放置在测试的资源文件夹中。目录

如果您指定applciation-test.yml并在yml中提供弹簧测试配置文件,则可以使用@ActiveProfiles('test')注释指示spring从 应用程序中获取配置你指定的-test.yml

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationTest.class)
@ActiveProfiles("test")
public class MyTest {
 ...
}

如果您使用的是JUnit 5,则不需要其他注释,因为 @SpringBootTest 已经包含了springrunner注释。保持单独的主ApplicationTest.class使我们能够为测试提供单独的配置类,并且我们可以通过从测试主类中的组件扫描中排除它们来阻止加载默认配置bean。您还可以提供要加载的配置文件。

@SpringBootApplication(exclude=SecurityAutoConfiguration.class)
public class ApplicationTest {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationTest.class, args);
    }
}

以下是关于使用YAML而不是.properties文件的Spring文档的链接:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

答案 6 :(得分:1)

从Spring 4.1开始,我们可以使用https://dropserv.content25.ec2.st-av.net/drop?source_id批注直接在application.yml中设置属性。

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = {"yoursection.yourparameter=your_value"})
public MyIntTest
{
 //your test methods
}

只需将yaml参数转换为完整的属性结构即可。 例如: 如果application.yml的内容如下所示

yoursection:
  yourparameter:your_value

然后进入@TestPropertySource的值将为

yoursection.yourparameter=your_value

答案 7 :(得分:1)

这可能被视为选项之一。现在,如果您想加载yml文件(在应用上述注释时默认未加载),诀窍是使用

@ContextConfiguration(classes= {...}, initializers={ConfigFileApplicationContextInitializer.class})

这是示例代码

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@DirtiesContext
@ContextConfiguration(classes= {DataSourceTestConfig.class}, initializers = {ConfigFileApplicationContextInitializer.class})
public class CustomDateDeserializerTest {


    private ObjectMapper objMapper;

    @Before
    public void setUp() {
        objMapper = new ObjectMapper();

    }

    @Test
    public void test_dateDeserialization() {

    }
}

再次确保设置配置Java文件-这里DataSourceTestConfig.java包含以下属性值。

@Configuration
@ActiveProfiles("test")
@TestPropertySource(properties = { "spring.config.location=classpath:application-test.yml" })
public class DataSourceTestConfig implements EnvironmentAware {

    private Environment env;

    @Bean
    @Profile("test")
    public DataSource testDs() {
       HikariDataSource ds = new HikariDataSource();

        boolean isAutoCommitEnabled = env.getProperty("spring.datasource.hikari.auto-commit") != null ? Boolean.parseBoolean(env.getProperty("spring.datasource.hikari.auto-commit")):false;
        ds.setAutoCommit(isAutoCommitEnabled);
        // Connection test query is for legacy connections
        //ds.setConnectionInitSql(env.getProperty("spring.datasource.hikari.connection-test-query"));
        ds.setPoolName(env.getProperty("spring.datasource.hikari.pool-name"));
        ds.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        long timeout = env.getProperty("spring.datasource.hikari.idleTimeout") != null ? Long.parseLong(env.getProperty("spring.datasource.hikari.idleTimeout")): 40000;
        ds.setIdleTimeout(timeout);
        long maxLifeTime = env.getProperty("spring.datasource.hikari.maxLifetime") != null ? Long.parseLong(env.getProperty("spring.datasource.hikari.maxLifetime")): 1800000 ;
        ds.setMaxLifetime(maxLifeTime);
        ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
        ds.setPoolName(env.getProperty("spring.datasource.hikari.pool-name"));
        ds.setUsername(env.getProperty("spring.datasource.username"));
        ds.setPassword(env.getProperty("spring.datasource.password"));
        int poolSize = env.getProperty("spring.datasource.hikari.maximum-pool-size") != null ? Integer.parseInt(env.getProperty("spring.datasource.hikari.maximum-pool-size")): 10;
        ds.setMaximumPoolSize(poolSize);

        return ds;
    }

    @Bean
    @Profile("test")
    public JdbcTemplate testJdbctemplate() {
        return new JdbcTemplate(testDs());
    }

    @Bean
    @Profile("test")
    public NamedParameterJdbcTemplate testNamedTemplate() {
        return new NamedParameterJdbcTemplate(testDs());
    }

    @Override
    public void setEnvironment(Environment environment) {
        // TODO Auto-generated method stub
        this.env = environment;
    }
}

答案 8 :(得分:0)

我们可以使用@SpringBootTest注释从src \ main \ java \ com加载yml文件...因此,当我们执行单元测试时,所有属性都已存在于配置属性类中。

@RunWith(SpringRunner.class)
@SpringBootTest
public class AddressFieldsTest {

    @InjectMocks
    AddressFieldsValidator addressFieldsValidator;

    @Autowired
    AddressFieldsConfig addressFieldsConfig;
    ...........

    @Before
    public void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
        ReflectionTestUtils.setField(addressFieldsValidator,"addressFieldsConfig", addressFieldsConfig);
    }

}

我们可以使用@Value注释,如果你有很少的配置或其他明智的我们可以使用配置属性类。例如

@Data
@Component
@RefreshScope
@ConfigurationProperties(prefix = "address.fields.regex")
public class AddressFieldsConfig {

    private int firstName;
    private int lastName;
    .........

答案 9 :(得分:0)

使用

的简单工作配置

@TestPropertySource和属性

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {"spring.config.location=classpath:another.yml"})
public class TestClass {


    @Test

    public void someTest() {
    }
}

答案 10 :(得分:0)

Lu55选项1如何...

在单独的资源文件夹中添加仅测试的application.yml。

├── main
│   ├── java
│   └── resources
│       ├── application.yml
└── test
    ├── java
    └── resources
        └── application.yml

在此项目结构中,如果main下的代码正在运行,则将加载main下的application.yml,测试中将使用test.yml。

要设置此结构,请添加一个新的Package文件夹test / recources(如果不存在)。

Eclipse右键单击您的项目->属性-> Java Build Path->源选项卡->(位于最右边的对话框)“添加文件夹...”

内部源文件夹选择->标记测试->单击“创建新文件夹...”按钮->在Textfeld内键入“资源”->单击“完成”按钮。

按下“ Finisch”按钮后,您可以看到源文件夹{projectname} / src / test / recources(新)

可选:为“项目资源管理器”视图安排文件夹顺序。 在“订单和导出”选项卡上滑动,将{projectname} / src / test / recources移至底部。 申请并关闭

!!!清理项目!
Eclipse->项目->清洁...

现在有一个单独的yaml用于测试和主要应用。

相关问题