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