atLeast(2)).add(2); //验证至多挪用3次 verify(list。
我们要模仿返回Dao层的要领,不需要知道其底层详细是怎么实现的。
真实工具实际上还不存在的。
真实工具很难被建设的,eq(hello)); //下面的为无效的参数匹配利用 //verify(comparator).compare(anyString(),list.size()); A a = mock(A.class); //通过thenCallRealMethod来挪用真实的api when(a.doSomething(anyInt())).thenCallRealMethod(); assertEquals(999。
times(1)).add(1); //验证是否被挪用2次 verify(list,String name){ personDao.update(new Person(id,mockList.get(0)); assertEquals(0,jack); verify(personDao).update(argument.capture()); assertEquals(1,等效于下面的times(1) verify(list).add(1); verify(list, 3、mock利用的场景和长处 真实的工具具有不确定的行为,则我们需要把整个依赖树都构建出来,list.size()); //重置mock,atMost(3)).add(3); 5)模仿要领体抛出异常 @Test(expected = RuntimeException.class) public void doThrow_when(){ List list = mock(List.class); doThrow(new RuntimeException()).when(list).add(1); list.add(1); } 6)验证执行顺序 @Test public void verification_in_order(){ List list = mock(List.class); List list2 = mock(List.class); list.add(1); list2.add(hello); list.add(2); list2.add(world); //将需要排序的mock工具放入InOrder InOrder inOrder = inOrder(list,所以下面的代码会通过 verifyNoMoreInteractions(list); List list2 = mock(List.class); list2.add(1); list2.add(2); verify(list2).add(1); //查抄是否有未被验证的互动行为,原文出处: WhyWin Mock测试是单位测试的重要要领之一,mock的工具(mockList)为NULL,hello); //假如你利用了参数匹配,天气预报)。
mockList.get(1)); //第三次或更多挪用城市抛出异常 mockList.get(1); } 11)利用回调生成期望值 @Test public void answer_with_callback(){ //利用Answer来生成我们我们期望的返回 when(mockList.get(anyInt())).thenAnswer(new AnswerObject() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); return hello world:+args[0]; } }); assertEquals(hello world:0,mockList.get(0)); assertEquals(2,仓库跟踪老是干清洁净,假如没有 Mock。
提高开拓的效率 4、一些特点 可以 mock 详细类而不光止是接口 一点注解语法糖 @Mock 清洁的验证错误是 点击仓库跟踪, anyString() 或 refEq() 用于基于反射的相等匹配) 答允建设 自界说的参数匹配器 可能利用现有的 hamcrest 匹配器 5、maven设置 1)Junit的maven dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.11/version scopetest/scope /dependency 2)mockito的maven dependency groupIdorg.mockito/groupId artifactIdmockito-all/artifactId version1.9.5/version scopetest/scope /dependency 6、利用 首先我们需要引入静态资源 import static org.mockito.Mockito.*; import static org.junit.Assert.*; 1)验证行为 @Test public void verify_behaviour(){ //模仿建设一个List工具 List mock = mock(List.class); //利用mock的工具 mock.add(1); mock.clear(); //清空mock工具 //验证add(1)和clear()行为是否产生 verify(mock).add(1); verify(mock).clear(); } 2)模仿我们所期望的功效 public void when_thenReturn(){ //mock一个Iterator类 Iterator iterator = mock(Iterator.class); //预设当iterator挪用next()时第一次返回hello,就算是知道的,劳务派遣管理系统,第n次都返回world when(iterator.next()).thenReturn(hello).thenReturn(world); //利用mock的工具 String result = iterator.next() + + iterator.next() + + iterator.next(); //验证功效 assertEquals(hello world world,never()).add(2); //验证零互动行为 verifyZeroInteractions(list2, ,times(2)).add(2); //验证是否被挪用3次 verify(list,如:某个接口依赖其他系统的处事可能该接口还没开拓出来,为了制止反复的mock,真实工具的某些行为很难被触发,因为会挪用真实工具的get(0),我们就可以利用mock假设其返回的数据举办测试,我们常常会碰着测试的时候需要去数据库中查询某些数据。
mock.size()); } 14)捕捉参数来进一步断言 @Test public void capturing_args(){ PersonDao personDao = mock(PersonDao.class); PersonService personService = new PersonService(personDao); ArgumentCaptorPerson argument = ArgumentCaptor.forClass(Person.class); personService.update(1,a.doSomething(999)); } class A{ public int doSomething(int i){ return i; } } 16)重置mock @Test public void reset_mock(){ List list = mock(List.class); when(list.size()).thenReturn(10); list.add(1); assertEquals(10,在后头会补上,那么所有的参数都必需通过matchers来匹配 verify(comparator).compare(anyString(),mockList.get(1)); assertEquals(1,它可以或许帮你模仿这些依赖, 答允机动有序的验证(譬喻:你任意有序 verify ,对付某些不容易结构(如 HttpServletRequest 必需在Servlet 容器中才气结构出来)可能不容易获取较量巨大的工具(如 JDBC 中的ResultSet 工具),我们但愿模仿这样类要领的返回。
comparable.compareTo(Test)); assertEquals(2, comparable.compareTo(Omg)); //对付没有预设的环境会返回默认值 assertEquals(0,。
times(2)).add(anyInt()); //查抄是否有未被验证的互动行为,因为add(2)没有被验证,new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return 999; } }); //下面的get(1)没有预设,spy.get(999)); spy.get(2); } 13)修改对未预设的挪用返回默认期望值 @Test public void unstubbed_invocations(){ //mock工具利用Answer来对未预设的挪用返回默认期望值 List mock = mock(List.class,spy.size()); assertEquals(1,而改用do-when语句 @Test(expected = IndexOutOfBoundsException.class) public void spy_on_real_objects(){ List list = new LinkedList(); List spy = spy(list); //下面预设的spy.get(0)会报错,Sevice挪用了Dao层。
argument.getValue().getName()); } class Person{ private int id; private String name; Person(int id。
mockList.get(999)); } 12)监控真实工具 利用spy来监控真实的工具,很难举办回归测试,never()).add(4); //验证至少挪用一次 verify(list, 1、相关网址 官网:http://mockito.org/ 项目源码:https://github.com/mockito/mockito api:http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html 2、什么是Mock测试 Mock 测试就是在测试进程中,list3); } 8)找出冗余的互动(即未被验证到的) @Test(expected = NoInteractionsWanted.class) public void find_redundant_interaction(){ List list = mock(List.class); list.add(1); list.add(2); verify(list, 当我们需要测试A类的时候,如:Controller中挪用了Service的要领,排除所有的互动和预设 reset(list); assertEquals(0,list2); //下面的代码不能颠倒顺序。
mockList.get(0)); assertEquals(hello world:999,name)); } }