Làm thế nào để xác minh một phương thức của một đối tượng không giả được gọi là?


100

Có vẻ như mockito chỉ xác minh xem một phương thức của một đối tượng giả có được gọi hay không và đối tượng giả luôn có một cái gì đó giống như doReturn().when(mock object)

Nhưng tôi có thể tạo một đối tượng giả và xác định doReturn().when(mock object) rồi xác minh một phương thức của một đối tượng khác được gọi không?

Đây là những gì tôi muốn làm: Tôi xác định một môi trường giả lập và trả về một phản hồi bất kể điều gì xảy ra. Nhưng sau đó tôi muốn xác minh các phương thức khác nhau của anotherObj được gọi trong các trường hợp khác nhau.

Làm thế nào để làm điều đó?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}

Câu trả lời:


118

Bạn có thể sử dụng một Mockito Spy cho việc này. Nếu bạn thiết lập anotherObjlàm gián điệp, bạn có thể xác minh các lệnh gọi phương thức trên đối tượng đó. Trong ví dụ của bạn, bạn cần đảm bảo rằng lệnh gọi foosử dụng gián điệp thay vì triển khai thông thường anotherObj. Gián điệp được thiết lập như sau:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);

Điều đó có nghĩa là tôi có thể cần phải tạo và chèn nhiều đối tượng bị chế nhạo nếu tôi muốn xác minh nhiều thứ? điều đó không thuận tiện.
dùng389955

@ user389955 vâng, bạn cần thiết lập từng đối tượng bạn muốn kiểm tra làm gián điệp. Theo như tôi biết không có cách nào xung quanh điều đó. Mockito cần thêm proxy cho các đối tượng và ai đó phải cho Mockito biết đối tượng nào cần ủy quyền.
K Erlandsson

10
Thay vì nói "// do things", có thể hữu ích khi thêm rằng nó là "anotherObjSpy" phải thực hiện cuộc gọi phương thức đang được kiểm tra.
jwehrle

Cảm ơn @jwehrle, bạn cần sử dụng anotherObjSpy trong các lệnh gọi, nếu không các bài kiểm tra sẽ không hoạt động.
argoth

2

Chú thích đối tượng không giả bằng @Spychú thích và sau đó kiểm tra verify(). Kiểm tra cái này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.