按配置文件使用 yaml 属性进行 Spring Boot 测试

jok*_*arl 1 java spring configuration-files

所以在这个话题上有很多点击,但没有一个对我有用。

我有一个非常简单的配置类:

@Configuration
@ConfigurationProperties(prefix = "props")
public class TagIncluder {

    private static final String PARAMETER_NAME = "tags";

    private List<String> tags;

    public TagIncluder() {
        tags = new ArrayList<>();
    }

    public List<String> getTags() {
        return tags;
    }

    @Handler
    public void attachIncludedTags(Exchange exchange) {
        exchange.getIn().setHeader(PARAMETER_NAME, tags);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这个类能够加载不同的属性文件。我正在使用 yaml,我的文件名为application-tag_test.yml. 我曾尝试将此文件放在src/main/resources,src/test/resources和 中src/test/resources/config,但从未被提取。

这是属性文件的内容:

props:
  tags:
    - test 
Run Code Online (Sandbox Code Playgroud)

最后,测试用例:

@SpringBootTest
@ActiveProfiles("tag_test")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TagIncluder.class)
public class TagIncluderTest extends ExchangeTestSupport {

    @Autowired
    private TagIncluder sut;

    @Test
    public void attachIncludedTags_shouldUseTagsInFileIfFileSpecified() {
        Exchange testExchange = createExchange();
        sut.attachIncludedTags(testExchange);

        Assertions.assertThat(testExchange.getIn().getHeader("tags", List.class))
            .size().isGreaterThanOrEqualTo(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,我尝试application.properties在上述位置放置一个包含以下内容的文件:

spring.profiles.active=tag_test
Run Code Online (Sandbox Code Playgroud)

Spring 需要什么才能将我的 yaml 文件设置为被测测试类的所需配置?

更新

因此,经过一些探索和反复试验,我发现以下方法有效:

@SpringBootTest
@ActiveProfiles("tag_test")
@RunWith(SpringJUnit4ClassRunner.class)
public class TagIncluderTest extends ExchangeTestSupport {

    @Autowired
    private TagIncluder sut;

    @Test
    public void attachIncludedTags_shouldUseTagsInFileIfFileSpecified() {
        Exchange testExchange = createExchange();
        sut.attachIncludedTags(testExchange);

        Assertions.assertThat(testExchange.getIn().getHeader("tags", List.class))
            .size().isGreaterThanOrEqualTo(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的不同之处在于我删除了@ContextConfiguration注释,让 Spring 处理所有这些。

它要慢得多,我更愿意指定需要什么。我认为这在未来可能会中断,例如,如果我添加另一个配置类,该类将从整个上下文开始并抛出错误,因为这些属性未包含在我的application-tag_test.yml配置中。

最后,我为配置尝试的任何上述位置都对上述注释有效。该application.properties指定不需要配置文件。

如果有人知道的方式来指定哪些应该被装入的背景下,而不是,我是另一种解决方案非常感激。

jok*_*arl 5

根据上面 Jans 建议的一些指导,我设法将测试隔离到一个切片。自动配置测试写在这里,但是只涉及 Springs 预定义的@..Test注释。

@WebMvcTest例如,如果您深入研究,您会发现@ImportAutoConfiguration注释。

使用它,我们可以告诉我们的测试类为我们的应用程序的单个切片启用自动配置。此处提供教程。可以在spring-boot 存储库中找到可用于自动配置的工厂的完整列表。

最后,这是整个测试类:

@ActiveProfiles("tag_test")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = TagIncluder.class)
@ImportAutoConfiguration(classes = ConfigurationPropertiesAutoConfiguration.class)
public class TagIncluderTest extends ExchangeTestSupport {

    @Autowired
    private TagIncluder sut;

    @Test
    public void attachIncludedTags_shouldUseTagsInFileIfFileSpecified() {
        Exchange testExchange = createExchange();
        sut.attachIncludedTags(testExchange);

        Assertions.assertThat(testExchange.getIn().getHeader("tags", List.class))
            .size().isGreaterThanOrEqualTo(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

被测类未受影响。

所以现在我们可以:

  • 使用配置文件
  • 使用 yaml
  • 在 Spring Context 中只测试我们想要的类

这非常有启发性:)