CodeGym /Khóa học Java /Mô-đun 3 /đối tượng chế nhạo

đối tượng chế nhạo

Mô-đun 3
Mức độ , Bài học
Có sẵn

3.1 phương thức doReturn()

Bây giờ đến phép thuật ...

Giả sử bạn đã tạo một đối tượng giả mạo, nhưng bạn cần nó hoạt động bằng cách nào đó. Khi một số phương thức được gọi, điều gì đó quan trọng đã được thực hiện hoặc các phương thức trả về một kết quả nhất định. phải làm gì?

Thư viện Mockito cho phép bạn thêm hành vi mong muốn vào một đối tượng giả.

Nếu bạn muốn một đối tượng giả trả về một kết quả nhất định khi một phương thức nhất định được gọi, thì “quy tắc” này có thể được thêm vào đối tượng bằng cách sử dụng mã:

Mockito.doReturn(result).when(an object).method name();

Bạn thấy đấy, khi kết thúc cuộc gọi phương thức, method name?thực tế không có cuộc gọi nào đang diễn ra ở đây. Phương thức doReturn()trả về một đối tượng proxy đặc biệt với sự trợ giúp của nó giám sát các cuộc gọi của các phương thức của đối tượng và do đó, quy tắc được viết.

Lại. Đó chỉ là một cách thông minh để viết một quy tắc để thêm vào một đối tượng giả . Cần có một số kỹ năng để diễn giải chính xác đoạn mã đó trong đầu khi bạn nhìn thấy nó. Đi kèm với kinh nghiệm.

Tôi nghĩ rằng một ví dụ cụ thể là cần thiết. Hãy tạo một đối tượng lớp giả ArrayListvà yêu cầu phương thức của nó size()trả về số 10. Mã hoàn chỉnh sẽ như sau:

@ExtendWith(MockitoExtension.class)
class DoReturnTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation () {
         //create a rule: return 10 when calling the size method
        Mockito.doReturn(10).when(mockList).size();

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

Có, mã này sẽ hoạt động, thử nghiệm sẽ không thất bại.

3.2 phương thức when()

Có một cách khác để thêm quy tắc hành vi vào đối tượng giả - bằng cách gọi phương thức Mockito.when(). Nó trông như thế này:

Mockito.when(an object.method name()).thenReturn(result);

Đây là cách viết quy tắc hành vi đối tượng giả giống như quy tắc trước đó. So sánh:

Mockito.doReturn(result).when(an object).method name();

Ở đây, điều tương tự cũng xảy ra - việc xây dựng một quy tắc mới.

Đúng, ví dụ đầu tiên có hai nhược điểm:

  • cuộc gọi rất khó hiểu.an object.method name()
  • sẽ không hoạt động nếu phương thức methodname()trả về void.

Chà, hãy viết ra ví dụ yêu thích của chúng ta bằng cách sử dụngMockito.when()

@ExtendWith(MockitoExtension.class)
class WhenTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //create a rule: return 10 when calling the size method
        Mockito.when(mockList.size() ).thenReturn(10);

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

3.3 Phương thức doThrow()

Chúng tôi đã tìm ra cách làm cho một phương thức đối tượng giả trả về một kết quả cụ thể. Làm thế nào tôi có thể làm cho nó ném một ngoại lệ cụ thể? Gửi cho doReturn()?

Để ngăn phương thức quay lại, cụ thể là đưa ra một ngoại lệ, bạn cần đặt quy tắc bằng cách sử dụng tệp doThrow().

Mockito.doThrow(exception.class).when(an object).method name();

Và sau đó là tùy chọn thứ hai:

Mockito.when(an object.method name()).thenThrow(exception.class);

Một chút mong đợi, phải không?

Chà, bạn thấy đấy, bạn đã bắt đầu hiểu. Hãy sửa nó bằng một ví dụ:

@ExtendWith(MockitoExtension.class)
class DoThrowTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
        mockList.size(); //an exception will be thrown here
    }
}

Nếu bạn cần ném một đối tượng ngoại lệ cụ thể, thì hãy sử dụng cấu trúc của biểu mẫu:

Mockito.doThrow(new Exception()).when(an object).method name();

Chỉ cần truyền doThrow()một đối tượng ngoại lệ cho phương thức và nó sẽ được ném ra trong khi gọi phương thức.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION