目錄標題
- 第一章、參數匹配器
- 1.1)參數匹配器列表
- 1.2)參數匹配器示例
- ①anyInt()
- ②any(Class<> type)
- ③eq()
- ④same(expectedObject)
- ⑤endsWith()
- 第二章、參數捕捉器
- 2.1)@Captor
- 2.2)ArgumentCaptor類
第一章、參數匹配器
1.1)參數匹配器列表
Mockito框架中的參數匹配器是用于在測試中進行靈活驗證和存根設置的工具。如果使用了參數匹配器,方法中的所有參數都必須是匹配器。
verify(mockClass).someMethod(anyInt(), anyString(), eq("third argument"));
參數匹配器列表:
參數匹配器 | 解釋說明 |
---|---|
any() | 參數為任意類型 |
anyXxx() | 包括anyInt、anyBoolean、anyByte、anyChar、anyFloat、Double、anyString、anyList、anyIterable等等 |
any(Class<T> type) | 任意指定的Class類型,除了null |
isA(Class<T> type) | 指定類型的實現對象 |
eq(value) | 參數匹配指定的值 |
same(expectedObject) | 參數和給定的值是同一個對象 |
isNull() | 參數是null值 |
notNull() | 參數非null |
nullable(Class clazz) | null 或者給定的類型 |
contains(String substring) | 參數包含指定的字符串 |
matches(String regex) | 匹配正則表達式 |
endsWith(String suffix) | 以xx結尾 |
startsWith(String prefix) | 以xx開頭 |
argThat(ArgumentMatcher matcher) | 自定義匹配器 |
times() | 匹配精確的次數 |
1.2)參數匹配器示例
①anyInt()
示例:使用anyInt()方法來指定參數的范圍,從而實現了對mockList.get()方法的靈活驗證和存根設置。
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.List;public class TestList {@Testpublic void testList_Argument_Matchers() {List<String> mockList = mock(List.class);when(mockList.get(anyInt())).thenReturn("Mockito");assertEquals("Mockito", mockList.get(0));assertEquals("Mockito", mockList.get(1));assertEquals("Mockito", mockList.get(2));}
}
②any(Class<> type)
示例:使用參數匹配器any(Class type)來存根方法
import static org.mockito.Mockito.*;public class Example {public void testMethod() {// 創建一個mock對象MyClass myClass = mock(MyClass.class);// 使用參數匹配器any(Class<T> type)來存根方法when(myClass.method(any(String.class))).thenReturn("mocked");// 調用被存根的方法String result = myClass.method("input");// 驗證方法是否按預期調用verify(myClass).method(any(String.class));}
}
③eq()
示例:使用參數匹配器eq(value)來存根方法
import static org.mockito.Mockito.*;public class Example {public void testMethod() {// 創建一個mock對象MyClass myClass = mock(MyClass.class);// 使用參數匹配器eq(value)來存根方法when(myClass.method(eq("input"))).thenReturn("mocked");// 調用被存根的方法String result = myClass.method("input");// 驗證方法是否按預期調用verify(myClass).method(eq("input"));}
}
④same(expectedObject)
import org.junit.Test;
import static org.mockito.Mockito.*;public class ExampleTest {@Testpublic void testWithSameMatcher() {// 創建mock對象MyClass myClass = mock(MyClass.class);// 創建預期參數對象Object expectedObject = new Object();// 設置預期行為,使用參數匹配器same(value)來確保方法調用的參數是同一個對象when(myClass.methodWithArgument(same(expectedObject))).thenReturn("mockedResult");// 調用被測試方法String result = myClass.methodWithArgument(expectedObject);// 驗證預期行為verify(myClass).methodWithArgument(same(expectedObject));}
}
⑤endsWith()
import org.junit.jupiter.api.Test;
import static org.mockito.ArgumentMatchers.endsWith;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;public class ExampleTest {@Testpublic void testMethodWithEndsWithMatcher() {// 創建mock對象MyClass myClass = mock(MyClass.class);// 調用被測試方法myClass.myMethod("test123");// 驗證方法是否被調用,并且傳入的參數以特定后綴結尾verify(myClass).myMethod(endsWith("123"));}
}
特殊的匹配器,用于驗證實際對存根的調用,例如times()、never()、atLeast()等。
第二章、參數捕捉器
幫助我們捕捉傳遞給模擬對象方法的參數,并且使我們能夠對這些參數進行額外的斷言。在Java中,Mockito庫提供了@Captor注解和ArgumentCaptor類來實現參數捕捉器的功能。
2.1)@Captor
@Captor是Mockito框架中的一個注解,用于捕獲方法調用時傳入的參數,以便在測試中對參數進行斷言或驗證。
參數捕獲:在測試中,使用@Captor可以捕獲方法調用時傳遞的參數,以便在后續的斷言中驗證參數的值。
參數驗證:通過捕獲參數,可以對傳遞給方法的參數進行驗證,確保方法得到了期望的參數值。
靈活性:@Captor提供了一種靈活的方式來處理方法調用時的參數,使得測試更加精確和可靠。
// 示例代碼中使用@Captor注解捕獲參數
@ExtendWith(MockitoExtension.class)
class ExampleTest {@Captor//@Captor注解創建了一個ArgumentCaptor對象private ArgumentCaptor<String> stringCaptor;@Mockprivate SomeClass someClass;@Testvoid testSomething() {// 調用被測試方法someClass.doSomething("test");//verify(someClass)驗證someClass對象的doSomething方法是否被調用//通過stringCaptor.capture()捕獲doSomething方法的參數verify(someClass).doSomething(stringCaptor.capture());//通過stringCaptor.getValue()獲取捕獲的參數值assertEquals("test", stringCaptor.getValue());}
}
2.2)ArgumentCaptor類
ArgumentCaptor argument = ArgumentCaptor.forClass(Class clazz) 創建指定類型的參數捕獲器
argument.getValue() 獲取方法參數值,如果方法進行了多次調用,它將返回最后一個參數值
argument.getAllValues() 方法進行多次調用后,返回多個參數值
@Test
public void argumentCaptor() {// 創建模擬對象List mockList = mock(List.class);List mockList1 = mock(List.class);// 在模擬對象上調用add方法mockList.add("666");mockList1.add("aaa");mockList1.add("ttt");// 獲取方法參數ArgumentCaptor argument = ArgumentCaptor.forClass(String.class);verify(mockList).add(argument.capture());System.out.println(argument.getValue()); //666// 輸出捕獲的參數值,預期為"666"// 多次調用獲取最后一次ArgumentCaptor argument1 = ArgumentCaptor.forClass(String.class);verify(mockList1, times(2)).add(argument1.capture());System.out.println(argument1.getValue()); //ttt// 輸出捕獲的參數值,預期為"ttt"// 獲取所有調用參數System.out.println(argument1.getAllValues()); //[aaa, ttt]// 輸出捕獲的所有參數值,預期為["aaa", "ttt"]
}