You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在测试环境中从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:04:56