我如何添加TestPropertySource批注以覆盖ApplicationContext环境中的属性值,而不必将其放在测试类本身或其超类上?
我们将从spring 4.3.x和boot 1.5.x更新到spring 5.1.5和boot 2.1.3。这是升级前可用的代码:
其中包含测试的类:
@RunWith(SpringRunner.class)
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = {Application.class, FunctionalTestConfiguration.class}
)
public class HeaderManagementTest extends BaseServiceTest {
...
}
应用程序类:
@SpringBootApplication(...)
@Configuration
@ComponentScan(...)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, RibbonAutoConfiguration.class})
public class Application{
...
}
所有这些的关键,FunctionalTestConfiguration类:
@Configuration
@ComponentScan(basePackages = {...})
@TestPropertySource(locations = {"classpath:functional-test.properties"})
public class FunctionalTestConfiguration {
}
这是我们期望的:
SpringBootTest.classes
引入同样,此操作在更新之前有效。我刚刚在StackOverflow / spring源代码的黑洞中呆了两天,很多信息实际上是错误的。
此帖子“ Spring Boot: @TestPropertySource not loaded from imported configuration”说:
我昨天对其进行了调查,发现Spring仅在以下位置寻找此@TestPropertySource批注:
- 源测试类
- 测试类是否实现了接口
- 该测试类的超类
- 继承的注释
但是,在测试中,我发现TestPropertySource现在似乎仅在出现原始测试类或其父类时才起作用。注释似乎不再从接口中提取。
我假设问题是由TestPropertySource javadoc引起的,这是因为在新版本的Spring和Spring boot中进行了一些更改,在引入接口或读取时不再使用正确的类加载器classes
的{{1}}条目。
启用@TestPropertySource
如果已配置的上下文加载器支持@TestPropertySource,则启用它。每个作为AbstractGenericContextLoader或AbstractGenericWebContextLoader子类的SmartContextLoader都为@TestPropertySource提供自动支持,其中包括Spring TestContext Framework提供的每个SmartContextLoader。
我的问题是我们有一个测试支持库,该库提供了通常在每个测试类中完成的许多连接。我希望能够以最小的侵入性覆盖实际测试代码中的库中的应用程序环境值。我宁愿以简单的Spring常规方式执行此操作,而不是例如编写一个EnvironmentPostProcessor类来强制值重写。有人对我做错了什么有什么想法/做这件事的更好方法吗?