如何在所有测试中仅覆盖单个配置属性并遵循DRY原则?
我太懂这种不想重复写代码/配置的烦躁了——既要单独覆盖测试用的某个属性,又不想违背DRY原则,确实头疼。其实有几个超实用的方案,帮你一次性解决问题:
方法一:利用Spring Boot配置自动叠加特性(最推荐)
你之前可能误解了Spring Boot加载配置文件的逻辑:测试目录下的src/test/resources/application.properties根本不需要复制主配置里的所有属性!
Spring Boot的配置加载是有优先级的:它会先加载src/main/resources/application.properties里的全部配置,之后再加载src/test/resources/application.properties。如果测试配置里存在和主配置相同的属性键,就会用测试里的值覆盖;而测试配置里没提到的属性,会自动保留主配置里的原值,完全不用你手动复制。
所以你只需要在src/test/resources/application.properties里写这一行就够了:
app.secondprop=99
剩下的所有属性都会自动从主配置继承,彻底告别重复粘贴的麻烦。
方法二:用测试基类统一管理配置
如果因为项目的特殊要求,你不想用测试配置文件,还可以创建一个抽象的测试基类,把通用的配置写在基类上,所有测试类都继承这个基类就行:
import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest(properties = {"app.secondprop=99"}) public abstract class BaseTest { // 这里还可以放所有测试通用的工具方法、初始化逻辑等 }
之后你的每个测试类只需要简单继承它,不用再重复写配置属性:
class UserServiceTest extends BaseTest { // 你的测试代码写在这里就行,不用管配置的事 }
这样也能完美避免重复,所有测试都会统一使用基类里的配置。
方法三:借助Profile实现灵活配置
要是你想让配置更灵活,还可以用Spring的Profile功能。具体步骤如下:
- 创建
src/test/resources/application-test.properties,里面只写你要覆盖的属性:
app.secondprop=99
- 激活这个测试Profile:你可以在
src/test/resources/application.properties里加一行全局激活配置:
spring.profiles.active=test
或者在测试类上用@ActiveProfiles("test")注解激活。
这样所有测试都会自动加载这个专用的测试Profile配置,同时保留主配置里的其他属性,既灵活又不重复。
备注:内容来源于stack exchange,提问作者k314159

