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

Spring Boot环境下如何Mock二级@Autowired依赖类实现MainServiceImpl测试

二级@Autowired依赖Mock实现方案

你要求的测试场景技术上完全可以实现,以下是适配你当前技术栈的两种常用实现方式:


方案一:纯Mockito单元测试(无需启动Spring容器,执行效率高)

利用Mockito的@Spy注解声明使用真实的SubMainServiceImpl实例,Mockito会自动完成层级依赖的注入,刚好满足「直接依赖用真实实现、二级依赖Mock」的要求:

@RunWith(MockitoJUnit4Runner.class)
public class MainServiceTest {

    @InjectMocks
    private MainServiceImpl mainService;

    // @Spy声明使用真实的SubMainServiceImpl实现
    @Spy
    private SubMainServiceImpl subMainService = new SubMainServiceImpl();

    // Mock二级依赖
    @Mock
    private SubSubMainService subSubMainService;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMainSayHello() {
        // 仅Mock二级依赖的指定方法
        doReturn("Mocked SubSubSayHello").when(subSubMainService).subSubSayHello();
        String result = mainService.mainSayHello();
        Assert.assertThat(result, is("MainSayHello. Also...SubSayHello. Also...Mocked SubSubSayHello"));
    }
}

方案二:SpringBoot集成测试(基于Spring上下文实现)

如果需要依赖Spring容器的相关能力,可以用SpringBoot自带的@MockBean注解直接替换容器中的二级依赖实例,无需修改现有业务代码的注入逻辑:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SpringMainServiceTest {

    // 注入容器中真实的MainServiceImpl实例
    @Autowired
    private MainService mainService;

    // 替换容器中原有的SubSubMainService为Mock实例
    @MockBean
    private SubSubMainService subSubMainService;

    @Test
    public void testMainSayHello() {
        doReturn("Mocked SubSubSayHello").when(subSubMainService).subSubSayHello();
        String result = mainService.mainSayHello();
        Assert.assertThat(result, is("MainSayHello. Also...SubSayHello. Also...Mocked SubSubSayHello"));
    }
}

注意事项

  • 该实现方式会让测试代码与SubMainServiceImpl的内部依赖逻辑强耦合,若后续SubMainServiceImpl调整内部依赖,测试代码也需要同步修改
  • 若条件允许建议优先将字段注入改为构造器注入,可进一步简化测试代码的依赖注入逻辑,降低耦合度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:57:02