SpringBoot Testing

举报
西魏陶渊明 发表于 2022/09/25 02:27:27 2022/09/25
【摘要】 前面我们对Mockito的用法有了一个了解,这里告诉大家一个好消息,SpringBoot已经帮我们继承了 这些框架,而且提供了更加简单好用的API。 # 一、Mockito加载方式 前面我们说了两种加载方式 MockitoJUnitRunner 和 MockitoAnnotations.initMocks(this);...

前面我们对Mockito的用法有了一个了解,这里告诉大家一个好消息,SpringBoot已经帮我们继承了 这些框架,而且提供了更加简单好用的API。

# 一、Mockito加载方式

前面我们说了两种加载方式 MockitoJUnitRunnerMockitoAnnotations.initMocks(this); 这些在SpringBoot中都不需要了。

所以这一段就是废话, 不用在看了。但是相信你已经看完了。

# 二、Mockito必知概念

这些概念,参考Mockito章节,概念统统保留。

# 2.1 完全模拟 MockBean

只需要将@Mock 换成 @MockBean即可

# 2.2 部分模拟 SpyBean

只需要将@Spy 换成 @MockBean即可。主要这里有一个小坑。 如果是Feign接口,使用@SpyBean会报错。提示final class不能被代理。

原因是SpringBoot依赖的Mockito版本太古老了,是2.23.4。从Mockito2.7.6 开始已经解决了这个问题, 我们可以通过引入下面依赖解决。


    
  1. <dependency>
  2. <groupId>org.mockito</groupId>
  3. <artifactId>mockito-inline</artifactId>
  4. <version>3.3.3</version>
  5. </dependency>
1 2 3 4 5

解决方案就是帮我们新增了一个配置,启动Mockit的插件来生成代理。 大概原理就是及不实用JDK代理,也不是Cglib代理。 DefaultMockitoPlugins & InlineByteBuddyMockMaker

# 三、代码实例

# 3.1 @MockBean 完全模拟

没有被声明的方法返回值,对象类型返回null,基本类型是返回默认类型。

@MockBean完全模拟


    
  1. public class TradeShopIntegrationImplTest extends BaseApplicationTest {
  2. @Autowired
  3. private TradeShopIntegration shopBrandIntegration;
  4. @MockBean
  5. private BrandServiceApi brandService;
  6. @MockBean
  7. private GoodsStockApi goodsStockApi;
  8. @Test
  9. public void testGetAllBrands() {
  10. Mockito.doReturn(JsonResult.failure("fail")).when(goodsStockApi).getSkuList(Mockito.any());
  11. // 底层调用的是goodsStockApi.getSkuList()
  12. List<GoodsBaseMsgDTO> goodsBaseMsgDTOS = shopBrandIntegration.queryAllSku();
  13. // 因为前面声明了返回fail。所以这里没有数据返回。
  14. JsonConsoleUtils.println(goodsBaseMsgDTOS);
  15. // 这里因为使用的是Mock完全模拟,所以尽管前面没有声明返回值,就默认返回null
  16. List<OutBrandDTO> allBrands = shopBrandIntegration.getAllBrands();
  17. JsonConsoleUtils.println(allBrands);
  18. }
  19. }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

# 3.1 @SpyBean 部分模拟

没有被声明的方法返回值,走原来逻辑。

@SpyBean部分模拟


    
  1. public class TradeShopIntegrationImplTest extends BaseApplicationTest {
  2. @Autowired
  3. private TradeShopIntegration shopBrandIntegration;
  4. @MockBean
  5. private BrandServiceApi brandService;
  6. @MockBean
  7. private GoodsStockApi goodsStockApi;
  8. @Test
  9. public void testGetAllBrands() {
  10. Mockito.doReturn(JsonResult.failure("fail")).when(goodsStockApi).getSkuList(Mockito.any());
  11. // 底层调用的是goodsStockApi.getSkuList()
  12. List<GoodsBaseMsgDTO> goodsBaseMsgDTOS = shopBrandIntegration.queryAllSku();
  13. // 因为前面声明了返回fail。所以这里没有数据返回。
  14. JsonConsoleUtils.println(goodsBaseMsgDTOS);
  15. // 这里跟上面的区别就是,如果没有声明返回值,就走原来的方法。
  16. List<OutBrandDTO> allBrands = shopBrandIntegration.getAllBrands();
  17. JsonConsoleUtils.println(allBrands);
  18. }
  19. }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125858098

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。