精华内容
下载资源
问答
  • Mockito mock类部分方法

    千次阅读 2016-09-09 19:13:23
    Mockito mock类部分方法参考这个http://stackoverflow.com/questions/14970516/use-mockito-to-mock-some-methods-but-not-others/35504565#35504565
    展开全文
  • 在编写测试代码时,有些通用的基础功能调用语句常常出现在许多相似的业务里,若测试中需要Mock这些调用,就要在各个测试中重复提供同样的Mock方法。而通过Mock方法的复用机制,能够很好的避免编写臃肿重复Mock...

    目录

    一、概述

    二、复用Mock类

    三、复用Mock方法


    一、概述

    “Don't Repeat Yourself”是软件开发过程当中的一项重要原则(即“DRY原则”),在编写测试代码时,有些通用的基础功能调用语句常常出现在许多相似的业务类里,若测试中需要Mock这些调用,就要在各个测试类中重复提供同样的Mock方法。而通过Mock方法的复用机制,能够很好的避免编写臃肿重复Mock代码的麻烦。

    TestableMock支持两种粒度的Mock复用方式:复用Mock类复用Mock方法

    二、复用Mock类

    如果有两个或以上测试类需要Mock的方法近乎相同,那么采用类级别的Mock复用就是最省心的一种方式。

    进行类级别的Mock复用,只需将Mock容器定义为独立的类,然后在要使用它的测试类上通过@MockWith进行引用。例如:

    @MockWith(ServiceMock.class)
    public class AaaServiceTest {
        ...
    }
    
    @MockWith(ServiceMock.class)
    public class BbbServiceTest {
        ...
    }
    
    public class ServiceMock {
        ...
    }

    这样在AaaServiceTestBbbServiceTest类中的测试用例在执行时,都会用ServiceMock容器类中定义的Mock方法进行调用匹配和Mock替换。

    下面我们通过一个简单的示例,说明如何复用Mock类。

    【a】编写TestService,模拟服务提供者提供接口给其他消费者使用

    package com.alibaba.demo.basic;
    
    public class TestService {
        public String test01() {
            return "TestService#test01";
        }
    
        public String test02() {
            return "TestService#test02";
        }
    
        public String test() {
            return test01() + " & " + test02();
        }
    
    }

    【b】编写两个服务消费者,调用服务提供者TestService的接口

    package com.alibaba.demo.basic;
    
    public class AaaService {
    
        private TestService testService = new TestService();
    
        public String test01() {
            return testService.test();
        }
    
    }
    
    package com.alibaba.demo.basic;
    
    public class BbbService {
        private TestService testService = new TestService();
    
        public String test01() {
            return testService.test();
        }
    
    }

    【c】编写针对TestService的Mock容器类

    使用注解@MockWith(TestServiceMock.class)关联抽取出来的公共Mock类。

    package com.alibaba.demo.basic;
    
    import com.alibaba.testable.core.annotation.MockMethod;
    
    /**
     * 针对TestService的Mock容器类
     */
    class TestServiceMock {
    
        @MockMethod(targetClass = TestService.class)
        public String test01() {
            return "ServiceMock#Mock#test01";
        }
    
        @MockMethod(targetClass = TestService.class)
        public String test02() {
            return "ServiceMock#Mock#test02";
        }
    
    }
    

    【d】编写测试类AaaServiceTest

    同样的,使用注解@MockWith(TestServiceMock.class)关联抽取出来的公共Mock类。

    package com.alibaba.demo.basic;
    
    import com.alibaba.testable.core.annotation.MockWith;
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.Test;
    
    @MockWith(TestServiceMock.class)
    public class AaaServiceTest {
    
        private AaaService aaaService = new AaaService();
    
        @Test
        public void test01() {
            String result = aaaService.test01();
            System.out.println("result = " + result);
            Assertions.assertEquals("ServiceMock#Mock#test01 & ServiceMock#Mock#test02", result);
        }
    
    }
    

    【e】编写测试类BbbServiceTest

    package com.alibaba.demo.basic;
    
    import com.alibaba.testable.core.annotation.MockWith;
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.Test;
    
    @MockWith(TestServiceMock.class)
    public class BbbServiceTest {
    
        private BbbService bbbService = new BbbService();
    
        @Test
        public void test01() {
            String result = bbbService.test01();
            System.out.println("result = " + result);
            Assertions.assertEquals("ServiceMock#Mock#test01 & ServiceMock#Mock#test02", result);
        }
    
    }
    

    【f】运行单元测试

     

     可以看到,单元测试是成功通过的,以上就是关于如何通过抽取公共的Mock来实现Mock复用。

    三、复用Mock方法

    实际场景中,相比一次性复用整个Mock类的情况,更常见的是对部分高频Mock方法进行复用。

    Mock方法的复用可以通过Mock容器类的继承来实现,父类中定义的所有Mock方法都会在子类中自然存在,例如:

    public class AaaServiceTest {
        public static class Mock extends BasicMock {
            ...
        }
        ...
    }
    
    public class BbbServiceTest {
        public static class Mock extends BasicMock {
            ...
        }
        ...
    }
    
    public class BasicMock {
        @MockMethod(targetClass = UserDao.class)
        protected String getById(int id) {
            ...
        }
    }

    则名为getById的Mock方法在AaaServiceTestBbbServiceTest的测试用例执行时都会生效。

    同样通过一个示例看下如何通过Mock类的继承实现Mock方法的复用。

    【a】编写服务提供者接口

    package com.wsh.testable.mock.testablemockdemo;
    
    public class UserDao {
    
        protected String getById(int id) {
            return String.valueOf(id);
        }
    
        public String test(int id) {
            return getById(id);
        }
    
    }
    

    【b】编写两个服务消费者,调用服务提供者UserDao的接口

    package com.wsh.testable.mock.testablemockdemo;
    
    public class AService {
    
        private UserDao userDao = new UserDao();
    
        public String test(int id) {
            return userDao.test(id);
        }
    
    }
    
    package com.wsh.testable.mock.testablemockdemo;
    
    public class BService {
    
        private UserDao userDao = new UserDao();
    
        public String test(int id) {
            return userDao.test(id);
        }
    
    }
    

    【c】编写Mock容器基类

    package com.wsh.testable.mock.testablemockdemo;
    
    import com.alibaba.testable.core.annotation.MockMethod;
    
    public class UserDaoMock {
        @MockMethod(targetClass = UserDao.class)
        protected String getById(int id) {
            return "Hello," + id;
        }
    }
    

    【d】编写测试类AServiceTest

    Mock静态内存容器类,通过继承Mock基类实现Mock方法复用。

    package com.wsh.testable.mock.testablemockdemo;
    
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.Test;
    
    public class AServiceTest {
    
        private AService aService = new AService();
    
        public static class Mock extends UserDaoMock {
    
        }
    
        @Test
        public void test() {
            String result = aService.test(123456);
            System.out.println("result = " + result);
            Assertions.assertEquals("Hello,123456", result);
        }
    
    }
    

    【e】编写测试类BServiceTest

    Mock静态内存容器类,通过继承Mock基类实现Mock方法复用。

    package com.wsh.testable.mock.testablemockdemo;
    
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.Test;
    
    public class BServiceTest {
    
        private BService bService = new BService();
    
        public static class Mock extends UserDaoMock {
    
        }
    
        @Test
        public void test() {
            String result = bService.test(789);
            System.out.println("result = " + result);
            Assertions.assertEquals("Hello,789", result);
        }
    }
    

    【f】运行单元测试

     

    可以看到,我们编写的单元测试用例都是可以成功跑通的。以上就是关于通过继承Mock基类实现Mock方法复用的案例,实际工作中,如果有Mock方法大体类似的场景,我们灵活使用其中一种方式即可。

    展开全文
  • 在进行unittesting的时候,有时候需要mock一个中的非virtual方法。使用gmock自带的mock generator默认只能生成一个中virtual和pure virtual方法mock function. 不过稍作改动后就可生成一个所有方法mock ...

    在进行unittesting的时候,有时候需要mock一个类中的非virtual方法。使用gmock自带的mock generator默认只能生成一个类中virtual和pure virtual方法的mock function.

    不过稍作改动后就可生成一个类所有方法的mock header file

    在目录gmock-1.7.0/scripts/generator/cpp 中找到gmock_class.py文件,注释掉59行的代码“node.modifiers & function_type and” 就可以了。

    此改动求证与原作者Neal Norwitz先生,特此表示感谢!

    转载于:https://www.cnblogs.com/polarstern/p/4232875.html

    展开全文
  • 直接上代码: ...被mock类 public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Strin...

    这个问题纠结我很久,参考自 点击链接

    直接上代码:

    1. 被mock类
    public class Person {
    
      private String name;
      private int age;  public Person(String name, int age) {
        this.name = name;
        this.age = age;
      }
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public int getAge() {
        return age;
      }
    
      public void setAge(int age) {
        this.age = age;
      }
    
      public boolean runInGround(String location) {
        if(location.equals("ground")) {
          System.out.println("The person runs in the " + location);
          return true;
        } else {
          System.out.println("The person doesn't run in the " +   location);
          return false;
        }
    
      }
    
      public boolean isPlay() {
    
        if(this.runInGround("ground")) {
          System.out.println("The person plays.");
          return true;
        }
        else {
          System.out.println("The person doesn't play");
          return false;
        }
      }
    }

    2.Test类

    import org.junit.Assert;
    import org.junit.Test;
    import org.mockito.Mockito;
    
    public class PersonTest{
    
      @Test
      public void playTest() {
        Person person = new Person("name", 15, "23435678V");
    
        Person person1 = Mockito.spy(person);
    
        Mockito.doReturn(true).when(person1).runInGround("ground");
    
        Assert.assertEquals(true, person1.isPlay());
      }
    }

    主要起作用的是这句代码:

    Mockito.doReturn(true).when(person1).runInGround("ground");

    给出方法返回值,调用的打桩类对应mock方法,就有意想不到的结果。

    感谢这位博主的分享

    展开全文
  • PowerMock mock final的静态方法

    千次阅读 2020-08-09 21:19:06
    Junit + Powermock mock System.currentTimeMillis()方法,...被测代码是一个Util,其静态方法调用System.currentTimeMillis()方法: import java.util.concurrent.TimeUnit; public class TimeUtil { publi.
  • Mock方法介绍

    千次阅读 2018-06-14 17:31:01
    Mock方法的引入通常能帮助我们解决以上场景中遇到的难题。 3 Mock的引入带来了什么 在维基百科上这样描述Mock:In object-oriented programming, mock objects are simulated objects that mimic the behavior of ...
  • JMockit使用:mock一个方法

    千次阅读 2012-03-20 13:54:37
    关键词:如何mock一个方法、Expectations 源清单   Java代码  /**   * 演示如何mock一个方法   * @sina weibo:regbin@tom.com   */  public class DateUtil {   ...
  • 要测试ServiceImpl中的方法methodA 难点 methodA中调用了restTemplate的方法或者FeignClient的方法,而这两个方法都依赖第三方应用,如果第三方应用没有准备好,则会报错,为了在单元测试中不依赖第三方应用,因此...
  • mock Context 我们写单元测试时,经常会用到context对象,但是直接使用context经常报空指针异常 正确的mock方式如下 ...2.在setUp方法中初始化 @Before public void setUp() throws Exception { MockitoAn...
  • PowerMockito Mock私有方法

    千次阅读 2019-11-26 09:58:24
    使用PowerMockito mock私有方法
  • Jmockit对静态方法mock

    万次阅读 2016-06-08 19:46:33
    Jmockit对静态方法mock首先要明确一点,一个类型被注释为@Mocked后,其所有方法包括静态方法都将处于mocked状态MethodClass包含一个静态方法与public方法public class MethodClass { public static String ...
  • 接口测试-Mock测试方法

    万次阅读 多人点赞 2019-05-26 22:29:02
    对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。...
  • PowerMockito mock静态

    千次阅读 2020-02-25 23:22:59
    但是我们现在只想测试A中的方法,如果不用Mock,就需要准备所有其他依赖,并保证其他依赖是正常工作的,非常麻烦。但是现在我们可以通过Mock造一个假的正确的B结果出来,这样就将测试限制在对A本身中,...
  • 关键词:如何mock一个方法、Expectations 源清单   /** * 演示如何mock一个方法 * @sina weibo:regbin@tom.com */ public class DateUtil { private int type; public static final ...
  • Mock常用方法

    千次阅读 2016-10-16 17:19:51
    http://www.tuicool.com/articles/J7BFr2AMock 测试是单元测试的重要方法之一。Mockito是基于Java的Mock测试框架。 什么是 Mock 测试 Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest ...
  • 单元测试与 Mock 方法

    2019-04-17 01:00:47
    NULL 博文链接:https://username2.iteye.com/blog/1812762

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,535
精华内容 14,614
关键字:

mock方法本类