MockitoJUnitRunner
cung cấp cho bạn xác nhận tự động việc sử dụng khuôn khổ, cũng như tự động initMocks()
.
Việc xác nhận tự động việc sử dụng khuôn khổ thực sự đáng có. Nó cung cấp cho bạn báo cáo tốt hơn nếu bạn mắc một trong những sai lầm này.
Bạn gọi tĩnh when
phương pháp, nhưng không hoàn thành stubbing với một khớp thenReturn
, thenThrow
hoặc then
. (Lỗi 1 trong mã bên dưới)
Bạn gọi verify
một mô hình, nhưng quên cung cấp lệnh gọi phương thức mà bạn đang cố gắng xác minh. (Lỗi 2 trong mã bên dưới)
Bạn gọi when
phương pháp sau doReturn
, doThrow
hay
doAnswer
và vượt qua một mô hình, nhưng quên để cung cấp các phương pháp mà bạn đang cố gắng để còn sơ khai. (Lỗi 3 trong mã bên dưới)
Nếu bạn không có xác nhận của việc sử dụng khuôn khổ, những sai lầm không được báo cáo cho đến khi sau cuộc gọi đến một phương pháp Mockito. Đây có thể là
- trong cùng một phương pháp kiểm tra (như lỗi 1 bên dưới),
- trong phương pháp kiểm tra tiếp theo (như lỗi 2 bên dưới),
- trong lớp kiểm tra tiếp theo.
Nếu chúng xảy ra trong bài kiểm tra cuối cùng mà bạn chạy (như lỗi 3 bên dưới), chúng sẽ không được báo cáo.
Đây là cách mỗi loại lỗi đó có thể trông như thế nào. Giả sử ở đây JUnit chạy các bài kiểm tra này theo thứ tự chúng được liệt kê ở đây.
@Test
public void test1() {
// ERROR 1
// This compiles and runs, but it's an invalid use of the framework because
// Mockito is still waiting to find out what it should do when myMethod is called.
// But Mockito can't report it yet, because the call to thenReturn might
// be yet to happen.
when(myMock.method1());
doSomeTestingStuff();
// ERROR 1 is reported on the following line, even though it's not the line with
// the error.
verify(myMock).method2();
}
@Test
public void test2() {
doSomeTestingStuff();
// ERROR 2
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call to verify. But Mockito can't report
// it yet, because the call to the method that's being verified might
// be yet to happen.
verify(myMock);
}
@Test
public void test3() {
// ERROR 2 is reported on the following line, even though it's not even in
// the same test as the error.
doReturn("Hello").when(myMock).method1();
// ERROR 3
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call is being stubbed. But Mockito can't
// report it yet, because the call to the method that's being stubbed might
// be yet to happen.
doReturn("World").when(myMock);
doSomeTestingStuff();
// ERROR 3 is never reported, because there are no more Mockito calls.
}
Bây giờ khi tôi viết câu trả lời này lần đầu tiên hơn năm năm trước, tôi đã viết
Vì vậy, tôi muốn khuyên bạn nên sử dụng MockitoJUnitRunner
bất cứ nơi nào có thể. Tuy nhiên, như Tomasz Nurkiewicz đã chỉ ra một cách chính xác, bạn không thể sử dụng nó nếu bạn cần một JUnit runner khác, chẳng hạn như Spring.
Đề xuất của tôi bây giờ đã thay đổi. Nhóm Mockito đã thêm một tính năng mới kể từ lần đầu tiên tôi viết câu trả lời này. Đó là một quy tắc JUnit, thực hiện chính xác chức năng giống như MockitoJUnitRunner
. Nhưng nó tốt hơn, bởi vì nó không loại trừ việc sử dụng các vận động viên khác.
Bao gồm
@Rule
public MockitoRule rule = MockitoJUnit.rule();
trong lớp thử nghiệm của bạn. Thao tác này khởi tạo các mocks và tự động hóa xác thực khuôn khổ; giống như MockitoJUnitRunner
không. Nhưng bây giờ, bạn có thể sử dụng SpringJUnit4ClassRunner
hoặc bất kỳ JUnitRunner nào khác. Từ Mockito 2.1.0 trở đi, có các tùy chọn bổ sung kiểm soát chính xác loại sự cố được báo cáo.