栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

妈蛋,空降的老大叫写得代码全部都得要Mock,看来得996了

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

妈蛋,空降的老大叫写得代码全部都得要Mock,看来得996了

最近,D哥这边新来的技术老大,要求写得所有的代码必须Mock,没有达到90%,都得要打回来~

说实话,咱们组之前的任务比较重,能写完代码,在加点测试用例,就很nice了,这么一搞,看来又得要开始加班搞了,谁叫咱们是苦逼的码畜,男人当牛用,女人当男人用,说到底,大多数人跟D哥一样,因为穷才做程序员。。。

说实话,D哥去查看了一下市面上的mock工具,说实话,挺多的,说白了,按照实现原理,主要分为3类:

  1. 动态代理:Mockito、EasyMock、MockRunner
  2. 自定义类加载器:PowerMock
  3. 运行时字节码修改:JMockit、TestableMock

如下图:

 

动态代理:这种实现方式()只能在类的外围修修补补,不能改动类本身,因此,最安全,但功能也最弱。关于动态代理面试必问,建议多去研究一下。

自定义类加载和字节码修改:这两种方式都会修改类的字节码,前者通过完全接管类的加载过程中来实现,后者则是类加载完成后再对字节码进行“二次改造”;两者在功能上而言,差别并不大(见上图)。

因此,综合来看,阿里的 TestableMock 看起来似乎更牛逼

使用起来真的方便,正如它官网说得“换种思路写Mock,让单元测试更简单”。

无需初始化,不挑服务框架,甭管要换的是私有方法、静态方法、构造方法还是其他任何类的任何方法,也甭管要换的对象是怎么创建的。写好Mock定义,加个@MockMethod注解,一切统统搞定。

官网源码:https://github.com/alibaba/testable-mock

官方文档:https://alibaba.github.io/testable-mock

实现原理

它是基于运行时修改字节码,再通过扫描测试类中是否有@MockMethod、@MockConstructor等注解修饰的方法,来判断是否要进行对应的初始化,与测试框架实现完全解藕,体验上毫无入侵感。

# 如何上手?

1、引入相关依赖


  1.8
  0.5.2




  
    com.alibaba.testable
    testable-all
    ${testable.version}
    test
  
  
    org.junit.jupiter
    junit-jupiter-api
    ${junit.version}
    test
  


  
    
      org.apache.maven.plugins
      maven-surefire-plugin
      3.0.0-M5
      
      @{argLine} -javaagent:${settings.localRepository}/com/alibaba/testable/testable-agent/${testable.version}/testable-agent-${testable.version}.jar
      
    
  

2、增加一个类,调用任意方法、成员方法、静态方法,结合官方demo改动了一下,大家将就看吧,实例如下:

DemoMock.java

public class DemoMock {


    
    public String commonFunc() {
        return "idea ".trim() + "." + " studycoder.com".substring(1) + "_" + "idea.studycoder.com".startsWith("ab");
    }




    public String outerFunc(String website) {
        return innerFunc(staticFunc());
    }




    
    private static String staticFunc() {
        return "idea_studycoder_com".replace("_",".");
    }


    
    private String innerFunc(String website) {
        return "our website is: " + website;
    }
}

DemoMockTest.java

public class DemoMockTest {


    private DemoMock demoMock = new DemoMock();


    public static class Mock {


        @MockMethod(targetClass = DemoMock.class)
        private String innerFunc(String text) {
            return "mock_" + text;
        }


        @MockMethod(targetClass = DemoMock.class)
        private String staticFunc() {
            return "static";
        }


        @MockMethod(targetClass = String.class)
        private String trim() {
            return "idea";
        }


        @MockMethod(targetClass = String.class, targetMethod = "substring")
        private String sub(int i) {
            return "sub";
        }


        @MockMethod(targetClass = String.class)
        private boolean startsWith(String s) {
            return false;
        }
    }


    @Test
    void should_able_to_mock_common_method() {
        assertEquals("idea.sub_false", demoMock.commonFunc());
        verify("trim").withTimes(1);
        verify("sub").withTimes(1);
        verify("startsWith").withTimes(1);
    }


    @Test
    void should_able_to_mock_member_method() throws Exception {
        assertEquals("mock_static", demoMock.outerFunc("hello"));
        verify("innerFunc").with("static");
        verify("staticFunc").with();
    }
}

总结

从上面的实例中,咱们可以看出,相比其它的mock工具,阿里的TestableMock 写单元测试会方便很多,代码量也少了不少,但是也有一些缺点,比如一个方法多次调用返回不同值,需借助TestableTool.MOCK_CONTEXT,对代码来说有一定的侵入性,但总得来说,无不是一种最优的选择。

啥也不说了,D哥决定建议团队的兄弟们用起来了~最后分享自用的学习资料感谢大家的点赞支持

一:线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

 

二:一线互联网P7面试集锦+各种大厂面试集锦

 三:微服务

 

四:学习笔记以及面试真题解析

 

在这给大家推荐一个Java技术交流分享讨论的裙,那里每天都会有技术干货、技术动向、职业生涯、行业热点、职场趣事等一切有关于程序员的内容分享。

更有海量Java入门→中级→高级→架构等学习资料,相关源码视频,面试资料。资源还不错,如果你们有需要的话,扫描最末端二维码哈

 

 

 

转自: Java面试那些事儿
https://mp.weixin.qq.com/s/Q-zCr2qKbAfBcbXIecxT8g

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/532008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号