项目概况

SpringBoot Testing

2026-01-291 min read未分类
技术框架

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

一、Mockito加载方式

前面我们说了两种加载方式 MockitoJUnitRunner MockitoAnnotations.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 开始已经解决了这个问题, 我们可以通过引入下面依赖解决。

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

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

三、代码实例

3.1 @MockBean 完全模拟

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

@MockBean完全模拟

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

3.1 @SpyBean 部分模拟

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

@SpyBean部分模拟

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