项目中,有些函数需要处理某个服务的返回结果,而在对函数单元测试的时候,又不能启动那些服务,这里就可以利用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()); } }