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
相关产品推荐
相关产品推荐

