优雅单测-3用Mockito轻松解决复杂的依赖问题

相关链接
优雅单测-1基于SpringBoot快速单测
优雅单测-2基于Spring快速单测,生成单测覆盖报告
优雅单测-3用Mockito轻松解决复杂的依赖问题
优雅单测-4如何优雅的做Mybatis单测
优雅单测-5基于Mybatis支持苞米豆单测
优雅单测-6基于Mybatis支持苞米豆单测-源码实现详解

1.Mockito

Mockito是GitHub上用于Java使用最广泛的Mock框架

Mockito核心解决的问题:不管是测试驱动开发,还是系统架构本身,都会带来的依赖结构复杂问题;单元测试做软件中的最小可测试单元,只应依当前单元的配置。 所有较大的系统都会有依赖复杂的问题。 此类问题就需要Mock框架来解决

2.快速上手

使用很简单一般分3部:

  1. 模拟外部依赖注入容器

  2. 执行单测

  3. 验证单测逻辑

2.1 SpringBoot环境

2.1.1 依赖配置

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <version>${springboot.version}</version>
</dependency>

2.1.2 单测用例

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = LiveReportServiceTest.Config.class)
public class LiveReportServiceTest {
    @Autowired
    ILiveReportWriteService iLiveReportWriteService;
    @MockBean
    LiveReportMapper liveReportMapper;

    @Test
    public void updateLiveStatusTest() {
        int num = iLiveReportWriteService.updateById(1L);
        Assert.assertTrue(num >= 0);
    }

    @Configuration
    static class Config {
        @Bean
        ILiveReportWriteService iLiveReportWriteService() {
            return new LiveReportWriteServiceImpl();
        }
    }
}

@MockBean,在SpringBoot中通过@MockBean注解,就可以快速装在一个Mock的Bean了。

此方式通过非常简单的方式解决了系统层级之间单测的依赖,可以用在数据层和业务层,也可以用在业务层之间的多项依赖等依赖上的问题

直接执行:

image.png

2.1.3 复杂单测用例

可以看到如果使用了SpringBoot,并且使用@MockBean可以快速解决依赖的问题。但是,Mock出的LiveReportMapper对象其实是个空壳,那么既然是mock就要知道如何通过mock的方式解决各种复杂逻辑

下面模拟2种复杂逻辑,Service层的单元测试mock依赖的另外一个Service类"InfoService" ,并且mock里面的2个方法

  • 方法queryByLiveNo,任何调用都返回特定mock对象
  • 方法removeById,任何调用都mock异常情况出现

下面看例子:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = LiveReportServiceTest.Config.class)
public class LiveReportServiceTest {
    @Autowired
    ILiveReportWriteService iLiveReportWriteService;
 
    @Test
    public void updateLiveStatusTest() {
        int num = iLiveReportWriteService.updateById(1L);
        Assert.assertTrue(num >= 0);
    }
    
    @Test(expected = Exception.class)
    public void updateLiveStatusTest() {
        iLiveReportWriteService.remove(1L);
    }

    @Configuration
    static class Config {
        @Bean
        ILiveReportWriteService iLiveReportWriteService() {
            return new LiveReportWriteServiceImpl();
        }
        
        @Bean
        InfoService getLiveInfoService() throws LiveException {
            LiveInfoPO liveInfoPO = new LiveInfoPO(111L);
            liveInfoPO.setTime(System.currentTimeMillis());
            InfoService mock = Mockito.mock(InfoService.class);
            
            Mockito.when(mock.queryLiveInfoByLiveNo(Mockito.anyString())).thenReturn(liveInfoPO);
            Mockito.when(mock.removeById(Mockito.anyString())).thenThrow(new Exception());
            return mock;
        }
    }
}
  • 假设iLiveReportWriteService.remove方法内部依赖了InfoService.removeById, 那么执行iLiveReportWriteService.remove方法时就会跑出异常

  • 假设iLiveReportWriteService.updateById方法内部依赖了InfoService.queryLiveInfoByLiveNo,那么执行InfoService.queryLiveInfoByLiveNo方法时就会返回111的id

2.2 非SpringBoot环境

如果没有SpringBoot环境的Starter,可以直接使用Mockito。 除了@MockBean不能使用其他功能不受影响,参考上面例子

2.2.1 依赖配置

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
</dependency>

更多用法参考Mockito官方文档,此处不做赘述

官网地址:https://site.mockito.org/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351