2009-02-04 28 views
42

Tôi đang sử dụng Mockito để viết một bài kiểm tra đơn vị trong Java và tôi muốn xác minh rằng một phương thức nhất định là số cuối được gọi trên một đối tượng.Sử dụng Mockito để xác minh rằng không có gì được gọi sau phương thức

tôi đang làm một cái gì đó như thế này trong mã theo thử nghiệm:

row.setSomething(value); 
row.setSomethingElse(anotherValue); 
row.editABunchMoreStuff(); 
row.saveToDatabase(); 

Trong mô hình của tôi, tôi không quan tâm đến thứ tự mà tôi sửa tất cả mọi thứ trên hàng, nhưng nó rất quan trọng là Tôi không cố gắng làm bất cứ điều gì khác với nó sau khi tôi đã lưu nó. Có cách nào tốt để làm điều này?

Lưu ý rằng tôi không tìm kiếm verifyNoMoreInteractions: nó không xác nhận rằng saveToDatabase là điều cuối cùng được gọi, và nó cũng thất bại nếu tôi gọi bất cứ thứ gì trên hàng mà tôi không xác minh rõ ràng. Tôi muốn để có thể nói điều gì đó như:

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verifyTheLastThingCalledOn(row).saveToDatabase(); 

Nếu nó giúp, tôi chuyển sang Mockito từ một thử nghiệm JMock rằng đã làm điều này:

row.expects(once()).method("saveToDatabase").id("save"); 
row.expects(never()).method(ANYTHING).after("save"); 
+5

Lưu ý từ tương lai: chúng tôi cuối cùng đã tái cấu trúc để tránh sự phụ thuộc vào trật tự. Cụ thể, chúng tôi đã chuyển phần saveToDatabase() sang một lớp bên ngoài của mã, nơi nó sẽ tự động được gọi vào đúng thời điểm. Nói chung, nếu bạn cần phải làm một cái gì đó như thế này với một giả, các xét nghiệm của bạn đang nói cho bạn để refactor. Điều đó nói rằng, nó vẫn còn tốt đẹp để có một bài kiểm tra có thể làm việc cho đến khi thiết kế được thay đổi. –

Trả lời

52

Tôi nghĩ rằng nó đòi hỏi tùy chỉnh hơn công việc.

verify(row, new LastCall()).saveToDatabase(); 

và sau đó

public class LastCall implements VerificationMode { 
    public void verify(VerificationData data) { 
     List<Invocation> invocations = data.getAllInvocations(); 
     InvocationMatcher matcher = data.getWanted(); 
     Invocation invocation = invocations.get(invocations.size() - 1); 
     if (!matcher.matches(invocation)) throw new MockitoException("..."); 
    } 
} 

trả lời trước:

Bạn đang đúng. verifyNoMoreInteractions là những gì bạn cần.

verify(row).setSomething(value); 
verify(row).setSomethingElse(anotherValue); 
verify(row).editABunchMoreStuff(); 
verify(row).saveToDatabase(); 
verifyNoMoreInteractions(row); 
+0

Không. Tôi đã cập nhật câu hỏi để làm rõ lý do. –

+0

Oh wow. Tôi đã bỏ lỡ bản cập nhật của bạn cho đến khi tôi đang xem lại các câu hỏi cũ ngay bây giờ, nếu không tôi sẽ phải bỏ phiếu này sớm hơn. Điều đó trông giống như chính xác những gì tôi cần. Cảm ơn! –

+1

lỗi biên dịch: không thể được giải quyết – kmalmur

0

Câu hỏi này dẫn tôi thực hiện một số cải tiến đối với Việc xác minh có API trong JMockit (có sẵn trong phiên bản sắp tới 0,983).

Các giải pháp tôi đã đưa ra cho phép bạn viết (trong một phương pháp thử nghiệm):


    new VerificationsInOrder() {{ 
     unverifiedInvocations(); 
     row.saveToDababase(); 
    }}; 

... nếu bạn chỉ muốn xác minh rằng một phương pháp nhất định được gọi là sau khi mọi thứ khác. Để xác minh điều đó xảy ra trước tất cả các lời gọi khác, chỉ cần di chuyển cuộc gọi lên đầu. Điều này thực sự áp dụng cho bất kỳ chuỗi các lời gọi liên tiếp nào. Nếu ngoài việc xác minh ở trên, bạn cũng muốn xác minh rằng một số phương pháp khác được gọi theo bất kỳ thứ tự nào, có thể thêm một số xác minh thứ hai vào thử nghiệm (trước hoặc sau khối khác). t matter):


    new Verifications() {{ 
     row.setSomething(value); 
     row.setSomethingElse(anotherValue); 
    }}; 

Mặc dù hơi dài do sử dụng các lớp bên trong vô danh, cú pháp này vừa đơn giản vừa linh hoạt; lưu ý cách nó thêm cấu trúc vào thử nghiệm và tránh lặp lại các cuộc gọi phương thức (như verify(...)). Có nhiều thứ hơn tôi mô tả ở đây (các trình ghép Hamcrest, số lượng yêu cầu, vv), và không giới hạn việc xác minh các phương thức mẫu (các phương thức tĩnh và các hàm tạo có thể được mô phỏng và xác minh theo cùng một cách).

9

Không 100% về chủ đề nhưng tôi chỉ đang tìm cách đối diện với xác minh và đây là kết quả có liên quan duy nhất, kết thúc là tôi đã theo dõi Mockito.verifyZeroInteractions (mô phỏng);

Chỉ cần bất kỳ ai khác kết thúc ở đây tìm kiếm điều này ...

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