如何对Spring中@PostConstruct方法做单元测试并修改application.properties配置
单元测试实现方案
实现思路
核心解决两个问题:
- 每次测试自动生成独立的临时CSV文件,测试完成后自动清理,无需手动维护文件路径
- 控制Spring Bean初始化时机,保证每次测试时
@PostConstruct修饰的init方法都会读取本次测试生成的新文件
具体实现(基于Spring Boot + JUnit 5)
测试代码示例
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import java.nio.file.Files; import java.nio.file.Path; import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest // 每次测试方法执行后销毁Spring上下文,下次测试重新初始化ReaderService,触发@PostConstruct重新读文件 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) class ReaderServiceTest { @Autowired private ReaderService readerService; // JUnit 5自动生成临时目录,测试结束后自动删除 @TempDir static Path tempDir; // 动态注入配置文件中的file.path属性,指向临时目录下的测试文件 @DynamicPropertySource static void configFilePath(DynamicPropertyRegistry registry) { registry.add("file.path", () -> tempDir.resolve("test-data.csv").toString()); } @Test void 测试全合法字段统计结果() throws IOException { // 1. 生成本次测试需要的CSV内容 String testCsv = "firstName,lastName,age\n" + "张三,李,25\n" + "王,二,35\n"; // 写入临时文件 Files.writeString(tempDir.resolve("test-data.csv"), testCsv); // 2. 执行测试逻辑并断言结果 StatisticReport report = readerService.calculateStatistics(); assertEquals(0, report.getFirstNameNullCounter()); assertEquals(0, report.getLastNameNullCounter()); assertEquals(0, report.getAgeNullCounter()); assertEquals(30.0, report.getAverageAge(), 0.001); } @Test void 测试含空字段统计结果() throws IOException { String testCsv = "firstName,lastName,age\n" + ",李,20\n" + "王,,30\n" + "赵,孙,\n"; Files.writeString(tempDir.resolve("test-data.csv"), testCsv); StatisticReport report = readerService.calculateStatistics(); assertEquals(1, report.getFirstNameNullCounter()); assertEquals(1, report.getLastNameNullCounter()); assertEquals(1, report.getAgeNullCounter()); assertEquals(16.6667, report.getAverageAge(), 0.001); } }
注意事项
你原有代码里的空值判断存在空指针风险:
// 错误写法:如果firstName为null,先调用equals会直接抛出空指针 if(person.getFirstName().equals("") || person.getFirstName() == null)
建议调整为:
// 先判断null再判断空串 if(person.getFirstName() == null || person.getFirstName().equals("")) // 或者直接用Spring自带的工具类更简洁 if(StringUtils.isBlank(person.getFirstName()))
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

