如何Mock Service并使其@Autowired字段加载配置文件值?
解决Mock Service时@Autowired字段为null的问题
问题根源
你用@Mock创建的是Mockito生成的Mock对象,不会触发Spring的依赖注入流程,因此Service内部的@Autowired字段不会被自动填充,导致propvalues为null。另外你的配置类写法存在错误,会导致Spring无法正确创建propvalues Bean。
第一步:修正配置类写法
原配置类中@Bean标注在private字段上是错误的,Spring无法识别并创建该Bean。正确写法如下:
@Configuration public class MyValuesConfig { @Bean(name = "propvalues") @ConfigurationProperties(prefix = "mysvcvalues") public Map<String,String> propvalues() { return new LinkedHashMap<>(); // Spring会自动将yml中的配置填充到这个Map中 } }
解决方案分两种场景
场景1:测试真实的Service实例(推荐)
如果需要Service的真实逻辑,同时让propvalues加载配置文件的值,应该使用Spring Boot的测试支持,而非纯Mockito:
@SpringBootTest(classes = {MyValuesConfig.class}, properties = {"spring.profiles.active=myvalues"}) @ExtendWith(MockitoExtension.class) public class MyServiceImplTest { // 注入真实的Service实例,Spring会自动填充propvalues @Autowired private MyServiceImpl myService; // 如果有其他依赖需要Mock,使用@MockBean替换Spring容器中的Bean @MockBean private SomeOtherDependency otherDependency; @Test void testServiceLogic() { // 此时myService的propvalues已加载配置文件中的值 // 可正常调用Service方法,同时验证otherDependency的交互 } }
场景2:必须Mock Service,但手动注入配置值
如果确实需要使用Mockito的Mock对象,可手动加载配置文件并注入到Mock对象中:
- 首先添加SnakeYAML依赖(用于解析YML文件):
<!-- Maven依赖 --> <dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <scope>test</scope> </dependency>
- 修改测试类:
@ExtendWith(MockitoExtension.class) public class MyServiceImplTest { @Mock private MyService myService; private Map<String, String> propvalues; @BeforeEach void setUp() { // 加载application-myvalues.yml中的配置 try (InputStream inputStream = getClass().getResourceAsStream("/application-myvalues.yml")) { Yaml yaml = new Yaml(); Map<String, Object> yamlData = yaml.load(inputStream); // 提取mysvcvalues前缀下的Map propvalues = (Map<String, String>) yamlData.get("mysvcvalues"); } catch (IOException e) { throw new RuntimeException("加载配置文件失败", e); } // 将propvalues注入到Mock对象中 ReflectionTestUtils.setField(myService, "propvalues", propvalues); } @Test void testMockService() { // 此时Mock的myService中propvalues已被设置为配置文件的值 } }
内容的提问来源于stack exchange,提问作者Andulos
相关产品推荐
相关产品推荐

