4.1 Tham số phương pháp
Các quy tắc trước đó được thêm vào đối tượng mô phỏng xử lý các phương thức không có tham số. Và làm cách nào để tạo quy tắc cho các phương thức có tham số? Hơn nữa, tôi muốn tạo các quy tắc sao cho một số giá trị tham số có một kết quả và đối với các giá trị khác - một kết quả khác.
Đó là cách bạn có thể làm điều đó quá. Nếu bạn muốn phương thức trả về một cái gì đó cụ thể với một tham số nhất định, thì quy tắc có thể được viết như sau:
Mockito.doReturn(result).when(an object).method name(parameter);
Hãy xem một ví dụ để hiểu rõ hơn. Hãy để Danh sách của chúng tôi trả về tên Ivan khi yêu cầu phần tử thứ 10 và tên Marya khi yêu cầu phần tử thứ 500. Không sớm nói hơn làm.
@ExtendWith(MockitoExtension.class)
class ParamsTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//adding the first rule
Mockito.doReturn("Ivan").when(mockList).get(10);
//adding a second rule
Mockito.doReturn("Maria").when(mockList).get(500);
assertEquals("Ivan", mockList.get(10));
assertEquals("Maria", mockList.get(500));
}
}
4.2 Mẫu thông số
Và ngay lập tức những đồng nghiệp tinh ranh sẽ hỏi tôi câu hỏi: “Điều gì sẽ xảy ra nếu phương thức yêu cầu đối số, nhưng với bất kỳ giá trị nào thì nó phải trả về cùng một kết quả?”. Chúng ta đừng viết:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Không, không ai bắt bạn phải viết như vậy. Nếu bạn muốn thêm một quy tắc vào một đối tượng giả hoạt động cho một phương thức với bất kỳ đối số nào, thì có một đối tượng đặc biệt cho việc này:
Mockito.any()
Ví dụ của chúng tôi với nó sẽ được viết như thế này:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Có một vài sắc thái ở đây. Đối tượng Mockito.any()
có loại Object
, do đó, có các chất tương tự cho các tham số thuộc các loại khác nhau:
Phương pháp | loại thông số | |
---|---|---|
1 | bất kì() | Đối tượng bao gồm null |
2 | bất kỳ (ClassName.class) | tên lớp |
3 | anyInt() | int |
4 | bất kỳBoolean() | boolean |
5 | anyDouble() | gấp đôi |
6 | anyList() | Danh sách |
Chính xác hơn, ví dụ của chúng ta sẽ như thế này:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 Phương thức doAnswer()
Chúng tôi đã nhận được hành vi phức tạp của các phương pháp ảo. Sớm hay muộn sẽ xảy ra tình huống khi bạn muốn phương thức ảo này có hành vi phức tạp. Ví dụ, nó sẽ trả về các giá trị tùy thuộc vào các tham số, chuyển đổi chuỗi thành chữ hoa.
Có một phương thức đặc biệt cho điều này - doAnswer()
, được truyền vào một hàm thực hiện những gì bạn cần:
Mockito.doAnswer(function).when(an object).method name(parameter);
Hãy làm cho phương thức get()
lớp List
trả về bình phương của đối số được truyền cho nó. Và viết chương trình sau:
@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.doAnswer(invocation -> {
int parameter = invocation.getArgument(0);
return parameter * parameter;
}).when(mockList).get(anyInt());
assertEquals(100, mockList.get(10));
assertEquals(25, mockList.get(5));
}
}
Chúng tôi đã định nghĩa hàm bằng cách sử dụng một đối tượng của lớp Trả lời.