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

2022-08-31 20:35:32

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

@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

在我当前的设置中,配置不为空,但没有可用的字段。字段不是字段的原因应该与我使用的不是Springboot而是Spring的事实有关。那么,Springboot的运行方式是什么呢?

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

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


答案 1

您需要按如下方式注释 TestConfiguraion:@EnableConfigurationProperties

@EnableConfigurationProperties
public class TestConfiguration {

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

此外,您只需要将以下内容包含在您的类中:TestConfiguration.class@ContextConfigurationSettingsTest

@TestPropertySource(locations = "/SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class SettingsTest {
...

答案 2

几点:

  1. 你不需要在主包中使用“TestConfiguration”类,因为它所做的就是配置“TestSettings”bean。您只需对 TestSettings 类本身进行批注即可。

  2. 通常,您将使用@SpringApplicationConfiguration注释加载测试所需的上下文,并传递 Application 类的名称。但是,您说您不想加载整个 ApplicationContext(尽管不清楚原因),因此您需要创建一个特殊的配置类来仅为测试执行加载。下面我称之为“TestConfigurationNew”,以避免与您原来的TestConfiguration类混淆。

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

更改代码,如下所示:

测试设置.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;
    }
}

设置测试.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 {
}

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