繁体   English   中英

Mock方法仅在传递给定类的任何*非null *对象时返回值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM