如何在测试中通过配置文件解析@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
相关产品推荐
相关产品推荐

