SpringBootTest & Mockito 虚实结合测试
起因
单一使用mockito,会出现很多mock困难的问题,导致测试编写过程太长,太恶心
单一使用springboottest,会遇到需要外部接口的地方,这个时候就非得去真实调用才行。也很恶心
所以 想到了混合使用 ,这个方法非原创,纯记录,以下的内容都是自己真实的
常用注解
注解使用时机@MockBean全部都走mock@SpyBean除特殊指定mock外,都执行真实方法
示例
importcn.hutool.core.util.RandomUtil;importcom.xxxx.util.exception.ServiceException;importcom.xxxx.xxx.common.core.entity.user.xxxxConfig;importcom.xxxx.xxx.common.core.utils.SecurityUtils;importcom.xxxx.xxx.common.mybatis.mapper.userMapper;importcom.xxxx.xxx.user.dto.xxxxDTO;importcom.xxxx.xxx.user.service.xxxxConfigService;importcom.xxxx.xxx.user.vo.xxxxVO;importcom.xxxx.xxx.verify.code.service.xxxxService;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.DisplayName;importorg.junit.jupiter.api.Test;importorg.mockito.Mockito;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.boot.test.mock.mockito.MockBean;importorg.springframework.test.annotation.Rollback;importorg.springframework.transaction.annotation.Transactional;importjavax.annotation.Resource;@Transactional@SpringBootTest@Rollback// 当模块中存在websocket的时候,需要使用下方注解配置,方可启动成功(以下配置会启动服务)// @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)classXxxxConfigServiceImplTest{@ResourceprivateXxxxConfigService xxxxConfigService;@MockBean(name ="userMapper")privateUserMapper myUserMapper;@ResourceprivateXxxxService xxxxService;publicstaticfinalString ACCOUNT =RandomUtil.randomString(8);publicstaticfinalString TEL =RandomUtil.randomNumbers(11);@BeforeEachvoidinit(){// mock方法返回Mockito.when(myUserMapper.selectTelByAccount(Mockito.anyString())).thenReturn(TEL);}@Test@DisplayName("修改:成功")voidupdate(){// 以下都是执行真实代码
xxxxDTO xxDTO =newxxxxDTO();
xxDTO.setAccount(ACCOUNT);
xxDTO.setPassword("123456");
xxDTO.setStartTime("00:00");
xxDTO.setEndTime("23:59");
xxDTO.setCaptchaCode("0000");
xxxxConfigService.sendCode(ACCOUNT);
xxxxConfigService.update(xxDTO);
xxxxConfig controlConfig = xxxxConfigService.lambdaQuery().eq(xxxxConfig::getAccount, ACCOUNT).one();assert controlConfig.getAccount().equals(xxDTO.getAccount());assert controlConfig.getStartTime().equals(xxDTO.getStartTime());assert controlConfig.getEndTime().equals(xxDTO.getEndTime());}}
常见问题
- MockBean导致启动失败,提示 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘xxx’ 解决方法:
// 属性名换一个 myUserMapper@MockBean(name ="userMapper")privateUserMapper myUserMapper;
版权归原作者 昱禹 所有, 如有侵权,请联系我们删除。