2013-02-28 23 views
9

Có thể đây là câu hỏi mới nhưng không thể tìm thấy câu trả lời.Mockito: Phương pháp Stub với đối tượng phức tạp làm tham số

Tôi cần phải khai báo phương thức với Mockito. Nếu phương thức có đối số "đơn giản", thì tôi có thể làm điều đó. Ví dụ: phương pháp tìm với hai tham số, màu ô tô và số cửa:

when(carFinderMock.find(eq(Color.RED),anyInt())).thenReturn(Car1); 
when(carFinderMock.find(eq(Color.BLUE),anyInt())).thenReturn(Car2); 
when(carFinderMock.find(eq(Color.GREEN), eq(5))).thenReturn(Car3); 

Vấn đề là đối số tìm là đối tượng phức tạp.

mappingFilter = new MappingFilter(); 
mappingFilter.setColor(eq(Color.RED)); 
mappingFilter.setDoorNumber(anyInt()); 
when(carFinderMock.find(mappingFilter)).thenReturn(Car1); 

Mã này không hoạt động. Lỗi là "Sử dụng đối sánh đối sánh không hợp lệ! 1 đối sánh dự kiến, 2 được ghi lại".

Không thể sửa đổi phương thức "tìm", nó cần phải là tham số MappingFilter.

Tôi giả sử rằng tôi phải làm "điều gì đó" để chỉ ra Mockito rằng khi ánh xạFilter.getColor là RED và ánh xạFilter.getDoorNumber là bất kỳ, thì nó phải trả lại Car1 (và giống nhau cho hai câu còn lại). Nhưng làm thế nào?

Trả lời

10

Sử dụng một khớp hamcrest , như được hiển thị trong the documentation:

when(carFinderMock.find(argThat(isRed()))).thenReturn(car1); 

nơi isRed() được định nghĩa là

private Matcher<MappingFilter> isRed() { 
    return new BaseMatcher<MappingFilter>() { 
     // TODO implement abstract methods. matches() should check that the filter is RED. 
    } 
} 
+0

Tuyệt vời, hoạt động hoàn hảo: D –

1

Bạn cần triển khai đúng phương thức equals() của MappingFilter. Trong số bằng(), bạn chỉ nên so sánh màu và không phải là doorNumber.

Ở dạng đơn giản nhất, nó sẽ giống như thế này -

@Override 
public boolean equals(Object obj) { 
    MappingFilter other = (MappingFilter) obj; 
    return other.getColor() == this.getColor(); 
} 

Ngoài ra, bạn nên hình thành MappingFilter của bạn chỉ đơn giản như dưới đây thay vì sử dụng bất kỳ khớp như eq

mappingFilter = new MappingFilter(); 
mappingFilter.setColor(Color.RED); 
mappingFilter.setDoorNumber(10); //Any integer 
+0

Cảm ơn câu trả lời của bạn! Có thể thực hiện nó mà không cần triển khai phương thức equals không? Ví dụ: bộ lọc có 20 trường và tôi chỉ muốn kiểm tra khi màu và số cửa có giá trị được chỉ định và trong một đoạn mã khác khi màu và loại ô tô có giá trị được chỉ định (không so sánh số cửa), v.v. –

+0

Vâng, cách khác, như được chỉ bởi @JB Nizet, đó dường như là cách để làm điều đó. – Gopi