Một lựa chọn khác là dựa vào equalsphương pháp thời trang cũ tốt . Miễn là đối số trong whengiả equalslậ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 someFieldnó 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 anyso sánh. Là một người đánh giá mã, tôi để mắt tới anycá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 whenphương thức. Answercho 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 Answerlambda, 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 anychí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 để Answerkiểm tra lập luận.