2013-02-26 29 views
7

Tôi có một lớp thử nghiệm (dựa trên TestNG), nơi tôi sử dụng Mockito.verify cho một đối tượng gián điệp.Đặt lại Mockito Spy

này hoạt động:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 
} 

Nhưng ở đây:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 

tôi nhận được một ngoại lệ Mokito mà tôi có thêm rằng một lời khẩn cầu someMethodNeedToBeChecked phương pháp. Tất nhiên tôi đã cố gắng để thêm Mockito.reset(testObject) nhưng nó đã không giúp tôi cả.

Làm cách nào để đặt lại đối tượng gián điệp nếu tôi cần xác minh cùng một phương pháp trong một số thử nghiệm?

+0

Tôi hỏi một câu hỏi tương tự qua tại http://programmers.stackexchange.com/questions/188299/is-this-an- phương pháp thích hợp-sử dụng-of-mockitos-reset-phương pháp. Chỉ cần FYI, mặc dù có liên quan đến một giả không phải là gián điệp. –

+0

Bạn đã cố gắng thêm cuộc gọi vào 'đặt lại' ở đâu? Có thể chỉnh sửa mã của bạn để thể hiện nỗ lực của bạn, nhưng đã nhận xét? –

+0

Tôi chỉ đính kèm ví dụ mẫu, đặt lại tôi đã cố gắng thực hiện trong @BeforeMethod \ @BeforeClass, giống với @Sau, ngay cả trước khi xác minh - nó không hoạt động. Theo tôi hiểu đó là một vấn đề chỉ với gián điệp và thiết lập lại chỉ dành cho các đối tượng giả. –

Trả lời

12

Từ Mockito documentation:

mocks Reset (Kể từ 1.8.0)

người dùng thông minh Mockito khó sử dụng tính năng này bởi vì họ biết nó có thể là một dấu hiệu của xét nghiệm nghèo. Thông thường, bạn không cần phải thiết lập lại mocks của bạn, chỉ cần tạo mocks mới cho mỗi phương pháp thử nghiệm. Thay vì đặt lại(), hãy cân nhắc viết các phương pháp thử nghiệm đơn giản, nhỏ và tập trung vào các bài kiểm tra dài, được chỉ định quá mức. Mùi mã tiềm năng đầu tiên được đặt lại() ở giữa phương pháp thử nghiệm. Điều này có thể có nghĩa là bạn đang thử nghiệm quá nhiều. Thực hiện theo lời thì thầm của phương pháp thử nghiệm của bạn: "Hãy giữ cho chúng tôi nhỏ & tập trung vào hành vi đơn lẻ". Có một số chủ đề về nó trên danh sách gửi thư mockito.

Lý do duy nhất chúng tôi thêm phương thức reset() là làm cho nó có thể hoạt động với các trình chứa được chèn vào vùng chứa.

Bạn nên có lẽ chỉ tái tạo gián điệp trong một @BeforeMethod:

public class Program { 

    private TestObject testObject = new TestObject(); 
    private TestObject spyTestObject; 

    @BeforeMethod 
    public void buildSpy() { 
     spyTestObject = spy(testObject); 
    } 

    @Test 
    public void test1() { 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 
+0

Tôi không hiểu tại sao bạn đang nói rằng mỗi bài kiểm tra bây giờ sẽ cần phải mong đợi hai invocations. Các điệp viên được xây dựng lại trước mỗi phương pháp thử nghiệm. –

+0

Xin lỗi, tôi đã hiểu sai câu trả lời của bạn :-) –

+0

Cảm ơn, thực sự nó đã giúp tôi, nhưng nếu bạn sử dụng anotations như @InjectMocks và những người khác bạn cũng cần gọi initmocks có vẻ không đẹp. –

Các vấn đề liên quan