Android 单元测试(三) 之Mockito的使用

Mockito是一个很不错的模拟框架。它允许您使用干净简单的API编写漂亮的测试代码。
依赖

repositories { jcenter() }
dependencies { testCompile "org.mockito:mockito-core:2.+" }

继续使用前面的Calculater类编写测试类!

验证行为

/**
 * Created by scy on 2018/5/2.
 */
public class CalculaterMockTest {
    @Test
    public void sum() throws Exception {
        Calculater mCalculator = mock(Calculater.class);//模拟创建一个Calculater对象
        mCalculator.sum(1, 3);//使用模拟对象调用对象里面的方法
        verify(mCalculator).sum(1, 3);//验证sum方法是否发生
    }
}
  List list = mock(List.class);
        list.add(1);
        list.add(2);
        list.add(2);
        list.add(3);
        list.add(3);
        list.add(3);
        //验证是否被调用一次,等效于下面的times(1)
        verify(list).add(1);
        verify(list,times(1)).add(1);
        //验证是否被调用2次
        verify(list,times(2)).add(2);
        //验证是否被调用3次
        verify(list,times(3)).add(3);
        //验证是否从未被调用过
        verify(list,never()).add(4);
        //验证至少调用一次
        verify(list,atLeastOnce()).add(1);
        //验证至少调用2次
        verify(list,atLeast(2)).add(2);
        //验证至多调用3次
        verify(list,atMost(3)).add(3);

模拟期望结果

/**
 * Created by 
 * scy on 2018/5/2.
 */
public class CalculaterMockTest {
    @Test
    public void substract() throws Exception {
        Calculater mCalculator = mock(Calculater.class);//模拟创建一个Calculater对象
        when(mCalculator.substract(3,1)).thenReturn(3);//预设substract的返回值为3
        System.out.println(mCalculator.substract(3,1));//输出3
        assertEquals(3, mCalculator.substract(3,1));//3==3测试通过
    }
}
     Calculater mCalculator = mock(Calculater.class);//模拟创建一个Calculater对象
        when(mCalculator.substract(3, 1)).thenCallRealMethod();  //通过thenCallRealMethod来调用真实的api  
        System.out.println(mCalculator.substract(3, 1));//输出2
        assertEquals(2, mCalculator.substract(3, 1));
 //反复调用,我们希望对于每次调用都返回不同的mock值
 Calculater demo = mock(Calculater.class);//模拟创建一个Calculater对象
 //Mockito.anyInt()表示传入任何整数值,返回值都是预设值
  Mockito.when(demo.substract(Mockito.anyInt(), Mockito.anyInt())).thenReturn(12).thenReturn(1024);
  System.out.println(demo.substract(2,3));//12
  System.out.println(demo.substract(2,3));//1024
  System.out.println(demo.substract(2,3));//1024
// you can mock concrete classes, not only interfaces
LinkedList mockedList = mock(LinkedList.class);

// stubbing appears before the actual execution
when(mockedList.get(0)).thenReturn("first");
when(mockedList.get(1)).thenReturn(null);//预设结果为null

// the following prints "first"
System.out.println(mockedList.get(0));

// the following prints null
System.out.println(mockedList.get(1));

// the following prints "null" because get(999) was not stubbed
System.out.println(mockedList.get(999));
// mock creation
 List mockedList = mock(List.class);
 // using mock object - it does not throw any "unexpected interaction" exception
 mockedList.add("one");
 //预设当List清空自身时抛出空指针异常  
 doThrow(new NullPointerException()).when(mockedList).clear();
 mockedList.clear();

参数匹配

 Comparable comparable = mock(Comparable.class);  
    //预设根据不同的参数返回不同的结果  
    when(comparable.compareTo("Test")).thenReturn(1);  
    when(comparable.compareTo("Omg")).thenReturn(2);  
    assertEquals(1, comparable.compareTo("Test"));  
    assertEquals(2, comparable.compareTo("Omg"));  
    //对于没有预设的情况会返回默认值  
    assertEquals(0, comparable.compareTo("Not stub"));  
        Comparator comparator = mock(Comparator.class);
        comparator.compare("nihao","hello");
        //如果你使用了参数匹配,那么所有的参数都必须通过matchers来匹配
        verify(comparator).compare(anyString(),eq("hello"));
//        下面的代码报错: Invalid use of argument matchers!
//        verify(comparator).compare(anyString(),"hello");

参考
Mockito官方教程
mockito简单教程
https://static.javadoc.io/org.mockito/mockito-core/2.18.3/org/mockito/Mockito.html

猜你喜欢

转载自blog.csdn.net/chaoyangsun/article/details/80168516