Một lựa chọn khác là dựa vào equals
phương pháp thời trang cũ tốt . Miễn là đối số trong when
giả equals
lập đối số trong mã đang được kiểm tra, thì Mockito sẽ khớp với giả định.
Đây là một ví dụ.
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
sau đó, giả sử bạn biết giá trị của someField
nó sẽ là bao nhiêu, bạn có thể chế giễu nó như thế này.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
ưu điểm: Điều này rõ ràng hơn any
so sánh. Là một người đánh giá mã, tôi để mắt tới any
các nhà phát triển cơ sở viết mã, vì nó lướt qua logic của mã của họ để tạo ra đối tượng thích hợp được thông qua.
con: Đôi khi trường được truyền cho đối tượng là một ID ngẫu nhiên. Trong trường hợp này, bạn không thể dễ dàng xây dựng đối tượng đối số dự kiến trong mã giả của mình.
Một cách tiếp cận khả thi khác là sử dụng Answer
đối tượng của Mockito có thể được sử dụng với when
phương thức. Answer
cho phép bạn chặn cuộc gọi thực tế và kiểm tra đối số đầu vào và trả về một đối tượng giả. Trong ví dụ dưới đây, tôi đang sử dụng any
để bắt bất kỳ yêu cầu nào đối với phương thức bị chế giễu. Nhưng sau đó trong Answer
lambda, tôi có thể kiểm tra thêm đối số Bazo ... có thể để xác minh rằng một ID thích hợp đã được chuyển cho nó. Tôi thích điều này hơn any
chính nó để ít nhất một số kiểm tra được thực hiện trên đối số.
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
Vì vậy, để tổng hợp tất cả, tôi thích dựa vào equals
(trong đó đối số dự kiến và đối số thực tế phải bằng nhau) và nếu không thể bằng nhau (do không thể dự đoán trạng thái của đối số thực tế), tôi sẽ dùng đến để Answer
kiểm tra lập luận.