【java】单元测试Mockito中的Mock和Spy

匿名 (未验证) 提交于 2019-12-02 20:37:20

项目中,有些函数需要处理某个服务的返回结果,而在对函数单元测试的时候,又不能启动那些服务,这里就可以利用Mockito工具。Mockito中的Mock和Spy都可用于拦截那些尚未实现或不期望被真实调用的对象和方法,并为其设置自定义行为。二者的区别在于:

1、Mock实现的对象中,除了使用doCallRealMethod()定义之外,对函数的调用均执行mock(即虚假函数),不执行真正部分。

2、Spy实现的对象中,除了使用when().thenReturn()定义之外,对函数的调用均执行真正部分。

例:

 public class Main {      public void fun(String s) {         System.out.println(s + " : fun");         fun1(s);         fun2(s);     }      public void fun1(String s) {         System.out.println(s + " : fun1");     }      private void fun2(String s) {         System.out.println(s + " : fun2");     }      public int getVal(){         return 5;     } }

Mock使用实例:

1、使用doCallRealMethod().when()调用函数真正部分。

2、使用when().thenReturn自定义函数返回值。

 import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.when;  import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations;  public class MainTest {      @Mock     Main mockMain;      @Before     public void init() {         MockitoAnnotations.initMocks(this);     }      @Test     public void testFun() {         // 执行mock,而不是真正部分,所以没有打印任何信息         mockMain.fun("mock test One");          // doCallRealMethod声明后,执行真正部分         // 但是Mock只能对public(fun1)和protected函数进行mock         // 对private函数(fun2)仍执行真正部分         // 所以输出fun和fun2         doCallRealMethod().when(mockMain).fun(anyString());         mockMain.fun("mock test Two");          // 执行mock,输出int的默认值0,而不是5         System.out.println("val: " + mockMain.getVal());         // when声明后,既不走真正部分,也不走mock,直接返回thenReturn()中定义的值         // 注意:该值的类型需要和when中函数返回值类型一致         when(mockMain.getVal()).thenReturn(10);         System.out.println("val: " + mockMain.getVal());     }  }

Spy使用实例:

 import static org.mockito.Mockito.when;  import org.junit.Before; import org.junit.Test; import org.mockito.MockitoAnnotations; import org.mockito.Spy;  public class MainTest {      @Spy     Main spyMain;      @Before     public void init() {         MockitoAnnotations.initMocks(this);     }      @Test     public void testFun() {         // 执行真正部分         spyMain.fun("mock test One");          // 执行真正部分         System.out.println("val: " + spyMain.getVal());         // 自定义返回值         when(spyMain.getVal()).thenReturn(10);         System.out.println("val: " + spyMain.getVal());     } }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!