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

如何在测试中通过配置文件解析@Value注解

如何在测试中正确初始化@Value注解的filename值

你当前使用的MockitoExtension仅负责Mock对象的创建与注入,不会处理Spring的@Value注解,因此无法从application-test.yml中读取配置值。以下是几种可行的解决方案:

方案一:通过@SpringBootTest加载完整Spring上下文

该方式会启动Spring Boot测试上下文,自动识别并加载application-test.yml配置,同时可用@MockBean替换容器中的Repository为Mock实例:

@SpringBootTest(properties = "spring.profiles.active=test")
class ServiceTest {

    @Autowired
    private Service service;

    @MockBean
    private Repository repository;

    @Test
    void testFilenameLoaded() {
        // 需为Service添加filename的getter方法
        assertEquals("a beautiful name", service.getFilename());
    }
}

若需在测试类中直接获取filename,可直接注入:

@SpringBootTest(properties = "spring.profiles.active=test")
class ServiceTest {

    @Value("${filename}")
    private String filename;

    @Autowired
    private Service service;

    @MockBean
    private Repository repository;

    @Test
    void testFilename() {
        assertEquals("a beautiful name", filename);
        assertEquals(filename, service.getFilename());
    }
}

方案二:轻量级加载Spring上下文(不启动完整Spring Boot)

若不想加载完整Spring Boot上下文,可结合SpringExtension、@ContextConfiguration和@TestPropertySource,仅加载必要类与配置:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {Service.class})
@TestPropertySource(locations = "classpath:application-test.yml")
class ServiceTest {

    @Value("${filename}")
    private String filename;

    @MockBean
    private Repository repository;

    @Autowired
    private Service service;

    @Test
    void testFilename() {
        assertEquals("a beautiful name", filename);
        assertEquals(filename, service.getFilename());
    }
}

方案三:手动通过反射设置值(无需Spring上下文)

如果只是简单测试,可绕过Spring上下文,用反射直接设置filename:

@ExtendWith(MockitoExtension.class)
class ServiceTest {

    @Mock
    private Repository repository;

    private Service service;

    @BeforeEach
    void setUp() throws NoSuchFieldException, IllegalAccessException {
        service = new Service(repository);
        Field filenameField = Service.class.getDeclaredField("filename");
        filenameField.setAccessible(true);
        filenameField.set(service, "a beautiful name");
    }

    @Test
    void testFilename() {
        // 验证值已设置(需通过getter或反射读取)
    }
}

内容的提问来源于stack exchange,提问作者thmasker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:55:18