2017-01-19 15 views
9

Tôi có 4 lớp cho phép A, B, C, D gọi từng phương thức từ một phương thức khác.các cuộc gọi phương thức lồng nhau giả sử dụng mockito

Bây giờ tôi đã chế giễu lớp A, và muốn thử một phương pháp sử dụng Mockito

A a = Mockito.mock(A.class); 

và muốn để có được "foo" trên phương pháp đệ quy gọi như

a.getB().getC().getD() nên trở "foo"

Tôi đã thử

khi (a.getB(). GetC(). GetD()). ThenRet urn ("foo");

nhưng có NullPointerException

sau đó tôi đã cố gắng

doReturn ("foo") khi (a.getB() getc() getD()...);

sau đó tôi đã org.mockito.exceptions.misusing.UnfinishedStubbingException:

Tôi biết tôi có thể tạo các đối tượng của B, C và D, hoặc thậm chí có thể viết một cái gì đó giống như

B b = giả (B.class) hoặc A .setB (mới B())

v.v.

Nhưng tôi không thể làm điều đó trong một cảnh quay? Mọi trợ giúp sẽ được đánh giá cao.

+5

RETURNS_DEEP_STUBS! Xem http://static.javadoc.io/org.mockito/mockito-core/2.6.3/org/mockito/Mockito.html#RETURNS_DEEP_STUBS –

Trả lời

16

Từ nhận xét:

RETURNS_DEEP_STUBS Thêm đã làm các trick:

A a = Mockito.mock(A.class, Mockito.RETURNS_DEEP_STUBS); 
+1

Hoặc, nếu sử dụng chú thích: '@Mock (answer = Answers.RETURNS_DEEP_STUBS)' –

5

Câu trả lời kỹ thuật bởi Abhijeet là đúng về mặt kỹ thuật, nhưng điều quan trọng cần hiểu là: bạn nên không được làm điều này.

"sản xuất" mã của bạn là nặng nề vi phạm Law of Demeter: lớp học của bạn Một nên không biết rằng nó có để có được một B để có được một C để có được một D.

Đó chỉ đơn giản dẫn đến siêu chặt chẽ khớp nối giữa tất cả các lớp này. Không phải là một ý tưởng tốt.

Trong ý nghĩa đó, bạn sẽ thấy thực tế rằng bạn cần làm những điều đặc biệt ở đây để làm việc thử nghiệm của bạn thực sự là dấu hiệu cho thấy mã sản xuất của bạn thực hiện điều gì đó là trong số bình thường.

Vì vậy, thay vì "sửa" thiết lập thử nghiệm của bạn, hãy xem xét giải quyết vấn đề thực sự.Và đó là thiết kế trong số mã sản xuất!

Và đối với bản ghi: getB(). GetC(). GetD() không phải là cuộc gọi "đệ quy"; nó là một chuỗi các cuộc gọi phương thức "thông thạo". Và như đã nói: đó là không phải một điều tốt.

+2

Tôi hoàn toàn đồng ý với bạn. Nhưng đôi khi để kiếm được bánh mì và bơ của mình, nhà phát triển phải viết các trường hợp thử nghiệm đơn vị cho các ứng dụng cũ, không phải ai cũng may mắn viết lại mã sản xuất. – Abhijeet

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