测试时如何将非静态@TempDir传入自定义@ConfigurationProperties
解决Spring Batch测试中@TempDir路径传入@ConfigurationProperties的问题
你可以通过以下几种方式实现将每个测试方法的临时目录路径传入MyConfiguration:
方案1:修改配置类为可变类,直接设置属性
因为当前用的是不可变的record类型配置类,无法直接修改属性,先把它改成带setter的普通类:
@ConfigurationProperties(prefix = "files") public class MyConfiguration { private String imagePath; public String getImagePath() { return imagePath; } public void setImagePath(String imagePath) { this.imagePath = imagePath; } }
然后在测试类的@BeforeEach方法中,直接注入MyConfiguration并设置临时目录路径:
@SpringBatchTest @SpringBootTest @SpringJUnitConfig(classes = ImageBatchJobApplication.class) class ImageBatchJobTests { @TempDir private Path imagePath; @Autowired private MyConfiguration myConfiguration; @BeforeEach void setUp() { myConfiguration.setImagePath(imagePath.toAbsolutePath().toString()); } // 你的测试方法 @Test void testImageProcessingJob() { // 这里myConfiguration的imagePath已经是当前测试的临时目录 // 执行Job测试逻辑... } }
方案2:通过环境变量重新绑定配置属性(保留record类型)
如果不想修改record类型的配置类,可以通过Spring的环境变量机制,在每次测试前更新属性并重新绑定配置:
@SpringBatchTest @SpringBootTest @SpringJUnitConfig(classes = ImageBatchJobApplication.class) class ImageBatchJobTests { @TempDir private Path imagePath; @Autowired private ConfigurableEnvironment environment; @Autowired private MyConfiguration myConfiguration; @Autowired private ApplicationContext applicationContext; @BeforeEach void setUp() { // 将临时目录路径添加到环境变量的最前面,确保优先级高于配置文件 TestPropertyValues.of("files.image-path=" + imagePath.toAbsolutePath()) .applyTo(environment); // 重新触发配置属性的绑定,让MyConfiguration读取新的属性值 ConfigurationPropertiesBindingPostProcessor binder = applicationContext.getBean(ConfigurationPropertiesBindingPostProcessor.class); binder.postProcessBeforeInitialization(myConfiguration, "myConfiguration"); } @Test void testImageProcessingJob() { // 验证路径是否正确设置 assertEquals(imagePath.toAbsolutePath().toString(), myConfiguration.imagePath()); // 执行Job测试... } }
注意事项
- 方案1更简单直接,但需要修改配置类的类型;方案2无需修改配置类,但需要处理属性重新绑定的逻辑。
@TempDir非静态字段默认会为每个测试方法创建独立的临时目录,符合你“每个测试生成新目录”的需求。
内容的提问来源于stack exchange,提问作者wolfsblu
相关产品推荐
相关产品推荐

