学习mockito


文章目录

  • 1:mockito介绍
  • 1.1:基本使用
  • 1.2:语法
  • 1:mock模拟
  • 2:when-thenReturn 预定期望动作
  • 3: when-thenThrow和 doThrow期望异常
  • 4:when_thenAnswer 期望返回结果
  • 5:.verify(检验交互)
  • 6: spy真实数据
  • 2:使用案例
  • 2.1:引入依赖


1:mockito介绍

Mockito就是一个优秀的用于单元测试的mock框架。在软件开发中提及”mock”,通常理解为模拟对象。所以Mockito就是为了模拟对象,然后进行解耦合测试。
Mock就是做一个假的object,对这个object里的方法的调用,都会被已经Mock的假对象拦截,然后返回用户预设的行为。

1.1:基本使用

集成Mockito的基本步骤

标记被Mock(模拟)的类或者对象,生成代理对象。@Mock 标注的对象对生成一个假的对象。
通过Mockito API定制代理对象的行为
调用代理对象的方法,获得预先设计的结果

1.2:语法

1:mock模拟

实现模拟对象
方式1:使用mock

//模拟创建一个List对象
        List mock = mock(List.class);

方式2:使用Mockito类

public void testMockSecond(){
        List mock = Mockito.mock(List.class);
        mock.add(1);
        System.out.println(mock.size());
        assertEquals(mock.size(),0);
    }

方式3:使用@mock注解

//指定运行器
@RunWith(MockitoJUnitRunner.class)
public class MockitoTestSecond {
    List one=new ArrayList();  //正常的创建对象
    @Mock     //注解模拟的对象
    List list;

    @Test
    public void one() {
        list.add(1);
        System.out.println(list.size());
        new MockitoTestSecond().one.add(1);
    }
}

mock重置,会清除所有的预定动作和值

List mock = mock(List.class);
        reset(mock);
2:when-thenReturn 预定期望动作

设定动作发生时期望的返回值

@Test
    public void when_thenReturnTwo(){
        ArrayList mock = Mockito.mock(ArrayList.class);
        预定当发生mock.add(1)动作时返回true,后面动作都返回false
        when(mock.add(1)).thenReturn(true).thenReturn(false);
        boolean add = mock.add(1);   //期望是true
        boolean add1 = mock.add(2);   //期望是false
        System.out.println(add+"--"+add1);   //结果  true--false
}
3: when-thenThrow和 doThrow期望异常

顾名思义:当发生什么动作时,抛出什么异常。
doThrow:用于无返回值的方法
thenThrow:用于有返回值的方法

@Test
    public void when_thenThrow3(){
        ArrayList mock = Mockito.mock(ArrayList.class);
       when(mock.add(1)).thenThrow(new RuntimeException());
        doThrow(new RuntimeException()).when(mock).clear();
        mock.add(1);
        mock.clear();
    }
4:when_thenAnswer 期望返回结果

当某个动作发生时,期望给的结果是

@Test
    public void when_thenAnswer(){
        ArrayList mock = Mockito.mock(ArrayList.class);
        when(mock.add(1)).thenAnswer(new Answer<Object>() {
            @Override
            public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
                return true;   //期望发生mock.add(1)动作全部返回true
            }
        });
        boolean add = mock.add(1);
      assertEquals(add,true);     //使用junit的断言判断
    }
5:.verify(检验交互)

检验交互行为是否发生,是个Boolean类型,默认是false,只要不爆出异常就代表行为发生正常。,可以传入timeout参数进行超时验证。

@Test
    public void testMockFour(){
        ArrayList mock = Mockito.mock(ArrayList.class);
        mock.add(1); //因为是模拟的list,所以实际的mock里没有被添加上1
        //使用verify进行交互验证判断add动作是否发生
        Boolean verify = verify(mock).add(2);  
         verify(mock,timeout(10)).add(1); //进行超时效率验证
        //可知依旧是false,没有抛出异常,也就是说正常情况下add行为进行正常
        System.out.println(verify);
    }
6: spy真实数据

使用spy来监控真实的对象会调用API去执行。而mock是模拟的不会执行api,注意两种的区别。
需要注意的是此时我们需要谨慎的使用when-then语句,而改用do-when语句.
when-then 会执行api,而do-when不会,所以do-when不能和mock结合使用(mock本来就是不会执行api的)

/*spy执行会正式的调用api去执行,和mock模拟有所不同*/
    @Test
    public void testSpy(){
        //使用spy模拟真实数据
        ArrayList<Object> objects = new ArrayList<>();
        List spy = spy(objects);
        when(spy.add(1)).thenReturn(true);
        //
        doReturn(false).when(spy).add(2);
        boolean add1 = spy.add(1);
        boolean add2 = spy.add(2);
        System.out.println(spy.size()+""+add1+"+"+add2);   //1

        List mock = mock(List.class);
        when(mock.add(1)).thenReturn(true);
       // doReturn(false).when(mock.add(2));   //mock对象本来就是模拟的,不能使用doreturn
        //使用mock的对象
        boolean add = mock.add(1);
        boolean add3 = mock.add(2);
        System.out.println(mock.size()+""+add+""+add3);      // 0
    }

结果

1true+false
0truefalse

2:使用案例

2.1:引入依赖

mockito需要和junit一起使用

<dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <version>4.0.0</version>
      <scope>test</scope>
    </dependency>
     <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>

简单验证使用

@Test
    public void testMockitoFirst(){
        //模拟创建一个List对象
        List mock = mock(List.class);
        //使用mock的对象
        mock.add(1);
        System.out.println(mock.size());        //0
        mock.clear();
        //验证add(1)和clear()行为是否发生
        verify(mock).add(1);
        verify(mock).clear();
    }