如何在测试环境中从application.yaml获取配置值?
解决单元测试中@Value配置注入为空的问题
方案1:加载Spring Boot上下文(集成测试场景)
如果测试需要依赖Spring容器的完整功能,在测试类上添加@SpringBootTest注解,它会自动读取application.yaml或application-test.yaml中的配置,完成@Value注入。
若要单独指定测试环境配置,可配合@ActiveProfiles指定测试profile,比如创建application-test.yaml并写入测试用的配置值:
# application-test.yaml user-service: defaultAdminId: "123e4567-e89b-12d3-a456-426614174000"
测试类修改如下:
@SpringBootTest @ActiveProfiles("test") class RegistrationServiceTest { @Autowired private RegistrationService registrationService; // 其他需要注入或Mock的依赖 @Test @DisplayName("When correct dto for registration not client then return after success registration for not client dto") public void returnAfterSuccessRegistrationForNotClient() { // 原测试逻辑不变 UserRegistrationForNotClientDto newUserNotClientDto = DtoCreatorForTest.getUserRegistrationForNotClientDto(); mockTuneUpsCreateAfterSuccessRegistrationDtoForNotClient(newUserNotClientDto); UserAfterSuccessRegistrationForNotClientDto expected = DtoCreatorForTest.getAfterRegistrationNotClientDto(newUserNotClientDto); UserAfterSuccessRegistrationForNotClientDto actual = registrationService.registrationForNotClient(newUserNotClientDto); Mockito.verify(userProfileRepository, Mockito.times(1)).save(any()); Assertions.assertEquals(expected, actual); } }
方案2:手动注入字段值(纯单元测试场景)
如果是不依赖Spring上下文的纯单元测试,可借助Spring的ReflectionTestUtils工具类,直接给私有字段DEFAULT_ADMIN_ID赋值:
import org.springframework.test.util.ReflectionTestUtils; class RegistrationServiceTest { @InjectMocks private RegistrationService registrationService; @Mock private UserProfileRepository userProfileRepository; // 其他需要Mock的依赖 @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); // 手动设置DEFAULT_ADMIN_ID的测试值 ReflectionTestUtils.setField(registrationService, "DEFAULT_ADMIN_ID", "123e4567-e89b-12d3-a456-426614174000"); } @Test @DisplayName("When correct dto for registration not client then return after success registration for not client dto") public void returnAfterSuccessRegistrationForNotClient() { // 原测试逻辑不变 } }
方案3:直接指定测试属性
在测试类上使用@TestPropertySource注解,直接配置测试用的属性值,无需额外配置文件:
import org.springframework.test.context.TestPropertySource; @TestPropertySource(properties = {"user-service.defaultAdminId=123e4567-e89b-12d3-a456-426614174000"}) @SpringBootTest class RegistrationServiceTest { @Autowired private RegistrationService registrationService; // 测试方法逻辑不变 }
内容的提问来源于stack exchange,提问作者Uladzislau Niamira
相关产品推荐
相关产品推荐

