部分mock

部分mock

在测试过程中,有个类的部分方法可能需要实际调用,而某些方法则是被mock的,也就是部分mock的场景。在Mockito中,可以使用Spy来实现。首先来看一个最简单的案例

public class SpyDemo {
   @Spy
   List<String> spy= new ArrayList<String>(); ;
     @BeforeEach
   public void setUp() {
       MockitoAnnotations.initMocks(this);
   }
   @Test
   public void TestSimpleSpy() {
       spy.add("one");
       spy.add("two");
       when(spy.size()).thenReturn(100);
       assertThat(spy.size()).isEqualTo(100);
       assertThat(spy.get(0)).isEqualTo("one");
   }

对于Spy来说,没有被打桩的调用默认都会执行真实的方法,如果是打过桩的则返回桩实现。在上述案例中,spy.size()通过桩实现返回了值100,而spy.get(0)则返回了实际值。

When(obj.do()) 还是 when(obj).do() ?

@Test
public void TestSayHello() {
    Demo demo=spy(new Demo();
when(demo.hello()).thenReturn("Ni hao r u");
    assertThat(demo.hello()).isEqualTo("Ni hao r u");
}
class Demo {
    public String hello() {
        System.out.println("hello");
        return "hello";
    }
}

通过执行这个用例,会发现虽然用例执行通过了,也就是demo.hello()的调用结果为返回"Ni hao r u"。但是,Mockito除了按照测试桩返回预期值之外,还调用了真实的hello()方法,也就是在终端打印出了“hello”。 换一种写法,使用doReturn.when的方式,

@Test
public void TestSayHello2() {
    doReturn("Ni hao r u").when(demo).hello();
    assertThat(demo.hello()).isEqualTo("Ni hao r u");
    reset(demo);
    assertThat(demo.hello()).isEqualTo("hello");
}

在这个情况下,真实的hello方法就不会被调用了。 When(obj.do()) 还是 when(obj).do()的写法,在之前介绍void方法测试时其实也有涉及到。由于when(obj.do())的类型检查,void方法采用这种写法,会直接在编译器的语法检查中失败。

Mockito.reset

在测试过程中,如果在设置了测试桩之后,还想调用真实方法来执行,则可以使用Mockito.reset来重置spy。如上一个用例中,在第二次调用demo.hello()方法前调用了reset方法重置demo,因此,这次方法调用的返回值就是”hello”。

总结一下,

1)When(obj.do()).thenXXX方法是类型安全的,一般情况下推荐使用。 2)doXX().when(obj).do()方法可以避免在spy时默认执行真实方法 3)可以通过reset方式去掉测试桩

本文分享自微信公众号 - V社 北京社(SoftwareTesters)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何选择一个性能测试工具(LoadRunner和Locust的一次对比)

    LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整...

    Criss@陈磊
  • 门面出租-测试工具中的设计模式实例谈之门面模式

    本文将以TestLinkAPI为案例,介绍门面模式(Facader Pattern)以及在TestLinkAPI中利用此模式提供统一对外服务接口,提高用户使用便...

    Criss@陈磊
  • Anaconda 安装&使用

    安装 官网 https://www.anaconda.com/ 选择 Python 3.7 版本

    Criss@陈磊
  • Linux 程序编译过程的来龙去脉

    大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解...

    刘盼
  • 【C语言系列】C语言编译流程分析

    前几天看了《程序员的自我修养——链接、装载与库》中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧。 我现在一般都是用gcc,所以自然以...

    程序员互动联盟
  • 给moco API添加limit功能

    在使用moco API的时候,发现文档中的一些功能并不能满足构建测试服务的需求,需要自己开发一些功能。之前两篇主要讲了moco本身的补充,本篇说说moco文档之...

    FunTester
  • Nginx限流

    YG
  • SAP最佳业务实践:MM–采购报价(128)-2报价请求

    1、流程概览表 流程步骤业务条件业务角色事务代码预期结果创建报价请求物料请求采购员ME41创建和打印 RFQ。列出报价RFQ 概览采购员ME4S列出 RFQ...

    SAP最佳业务实践
  • OpenFlow的伴侣协议:OF-CONFIG

    1 简介 在OpenFlow协议的规范中,控制器需要和配置好的交换机进行通信。而交换机在正常工作之前需要对其特性以及资源进行配置,才能正常工作。而这些配置超出了...

    SDNLAB
  • moco API模拟框架视频讲解(中)

    上期讲过了moco API模拟框架视频讲解(上),本期分享内容是对于匹配到的请求进行响应。首先请求先被匹配到相应规则按照先匹配到的规则进行响应,先到先得,这一点...

    FunTester

扫码关注云+社区

领取腾讯云代金券