轉載:https://blog.csdn.net/qq_30141957/article/details/81273829
項目中,有些函數需要處理某個服務的返回結果,而在對函數單元測試的時候,又不能啟動那些服務,這里就可以利用Mockito工具。Mockito中的Mock和Spy都可用於攔截那些尚未實現或不期望被真實調用的對象和方法,並為其設置自定義行為。二者的區別在於:
1、Mock聲明的對象,對函數的調用均執行mock(即虛假函數),不執行真正部分。
2、Spy聲明的對象,對函數的調用均執行真正部分。
例:
-
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 {
-
-
-
Main mockMain;
-
-
-
public void init() {
-
MockitoAnnotations.initMocks( this);
-
}
-
-
-
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使用實例
1、使用when().thenReturn自定義函數返回值。
-
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 {
-
-
-
Main spyMain;
-
-
-
public void init() {
-
MockitoAnnotations.initMocks( this);
-
}
-
-
-
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());
-
}
-
}
參考文章: