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

如何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对象中:

  1. 首先添加SnakeYAML依赖(用于解析YML文件):
<!-- Maven依赖 -->
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <scope>test</scope>
</dependency>
  1. 修改测试类:
@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:45:32