小编典典

如何使用@ConfigurationProperties和@Autowired测试类

spring-boot

我想测试依赖于@Autowired和加载的属性的应用程序的一小部分@ConfigurationProperties。我正在寻找一个仅加载所需属性而不是整个加载的解决方案ApplicationContext。这里作为简化示例:

@TestPropertySource(locations = "/SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestSettings.class, TestConfiguration.class})
public class SettingsTest {
    @Autowired
    TestConfiguration config;

    @Test
    public void testConfig(){
        Assert.assertEquals("TEST_PROPERTY", config.settings().getProperty());
    }
}

配置类别:

public class TestConfiguration {
    @Bean
    @ConfigurationProperties(prefix = "test")
    public TestSettings settings (){
        return new TestSettings();
    }
}

设置类别:

public class TestSettings {
    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

资源文件夹中的属性文件包含以下条目:

test.property=TEST_PROPERTY

在我当前的设置中,配置不为null,但是没有可用字段。字段不是字段的原因应该与我不是使用Springboot而是使用Spring有关。那么,Springboot怎样运行它呢?

编辑:
我想要这样做的原因是:我有一个解析器来解析文本文件,所使用的正则表达式存储在属性文件中。为了对此进行测试,我只想加载此解析器所需的属性,这些属性位于
TestSettings 上方的 示例中

在阅读注释时,我已经注意到这不再是单元测试了。但是,对于这个小测试,使用完整的Spring引导配置对我来说似乎有点过多。这就是为什么我问是否有可能只向一个类加载属性。


阅读 1291

收藏
2020-05-30

共1个答案

小编典典

几点:

  1. 您在主程序包中不需要“ TestConfiguration”类,因为它所做的只是配置“ TestSettings” bean。您可以简单地通过注释TestSettings类本身来做到这一点。

  2. 通常,您将使用 @SpringApplicationConfiguration 批注加载测试所需的上下文,并传递Application类的名称。但是,您说过您不想加载整个ApplicationContext(虽然尚不清楚原因),所以您需要创建一个特殊的配置类来仅对测试进行加载。在下面,我将其称为“ TestConfigurationNew”,以避免与您最初拥有的TestConfiguration类混淆。

  3. 在Spring Boot的世界中,所有属性通常都保存在“ application.properties”文件中。但可以将它们存储在其他位置。在下面,我指定了您建议的“ SettingsTest.properties”文件。请注意,您可以拥有此文件的两个副本,一个在main / resources文件夹中,一个在test / resources文件夹中用于测试。

更改代码,如下所示:

TestSettings.java(在主包中)

@Configuration
@ConfigurationProperties(prefix="test", locations = "classpath:SettingsTest.properties")
public class TestSettings {

    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

SettingsTest.java(在测试包中)

@TestPropertySource(locations="classpath:SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfigurationNew.class)
public class SettingsTest {

    @Autowired
    TestSettings settings;

    @Test
    public void testConfig(){
        Assert.assertEquals("TEST_PROPERTY", settings.getProperty());
    }
}

TestConfigurationNew.java(在测试包中):

@EnableAutoConfiguration
@ComponentScan(basePackages = { "my.package.main" })
@Configuration
public class TestConfigurationNew {
}

现在,这应该可以按照您想要的方式工作。

2020-05-30