[英]Mock method to return a value only when passed any *non-null* object of a given class
我正在使用Mockito模拟一个方法,在给定日期时返回日期。
when(supplier.calculateDeliveryDate(any(Date.class)))
.thenReturn(supplierDeliveryDate);
但是,我只希望它在传递一个非null Date对象时返回supplierDeliveryDate
。 传递null
,它应返回null。
这可能吗? 我该怎么做?
使用ArgumentMatchers.isNull()
匹配器。
when(supplier.calculateDeliveryDate(any(Date.class)))
.thenReturn(supplierDeliveryDate);
when(supplier.calculateDeliveryDate(isNull()))
.thenReturn(null);
您可以使用匿名内部类:
// unit test
public OrderServiceTest {
// instance of class-under-test
private OrderService instance;
// stub value
private Date supplierDeliveryDate = new Date();
// mock as an anonymous inner class
private Supplier supplier = new Supplier() {
public Date calculateDeliveryDate(Date input) {
if (input == null) {
return null;
}
else {
return supplierDeliveryDate;
}
}
};
@Before
public void setUp() {
instance = new OrderService();
// dependency injection
instance.setSupplier(supplier);
}
@Test
public void testOrderHappy() {
// SETUP
Date orderDate = new Date();
// CALL
Date result = instance.order(orderDate);
// VERIFY
assertTrue(supplierDeliveryDate == result);
}
@Test
public void testOrderNull() {
// SETUP
Date orderDate = null;
// CALL
Date result = instance.order(orderDate);
// VERIFY
assertNull(result);
}
}
但你真的想知道为什么你需要这种行为。
如果您编写一个定义良好的测试用例,那么您应该确切地知道调用模拟的频率和参数。 如果是这样,那么您可以存根预期的调用,而不是使用条件行为连接模拟。
请注意,如果您的测试尽可能“锐利”,则非常有用。 如果调用的模拟次数与预期不同,或者使用不同的参数,则测试应该失败。
您可以使用帮助方法:
public static <T> void validateAndMock(Supplier<T> ongoingStubbing, T mockedResponse) {
if (mockedResponse != null) {
when(ongoingStubbing.get()).thenReturn(mockedResponse);
}
}
然后打电话:
validateAndMock(() -> supplier.calculateDeliveryDate(any(Date.class)), supplierDeliveryDate);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.