2016-12-05 8 views
0

Я использую Mockito, чтобы высмеять метод возврата даты при дате.Метод mock для возврата значения только при передаче какого-либо объекта * не нуль * данного класса

when(supplier.calculateDeliveryDate(any(Date.class))) 
    .thenReturn(supplierDeliveryDate); 

Однако, я только хочу, чтобы вернуть supplierDeliveryDate когда он передается ненулевым Дата объект. Когда прошло null, он должен вернуть null.

Возможно ли это? Как мне это сделать?

ответ

1

Вы можете использовать анонимный внутренний класс:

// 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); 
    } 
} 

Но вы действительно должны задаться вопросом, почему вам нужен этот вид поведения.

Если вы пишете четко определенный тестовый пример, вы должны точно знать, как часто и с какими аргументами вызывается ваш макет. Если это так, вы можете просто заглушить ожидаемые вызовы, а не подключать свой макет с условным поведением.

Обратите внимание, что это полезно, если ваш тест как можно более «резкий». Если разное количество вызовов достигает вашего макета, чем ожидалось, или с разными аргументами, тогда тест должен завершиться неудачно.

+0

К сожалению, ваш пример кода не связаны с вопросом, так как он изменяет поведение производственного кода, а не тестовый код, как запрошено ОП. но мне нравится ваше заявление в вашем ответе. Я бы проголосовал, если вы удалите пример ... –

+0

@Adriaan Я добавляю к существующему тесту. Тест проходит, когда заданная дата имеет значение NULL, но производственный код заканчивается выбросом исключения NullPointerException. Я хотел бы внести минимальные изменения в существующий тест, но попробуйте проверить этот случай null Date. –

+0

@TimothyTruckle 'Supplier.calculateDeliveryDate (...)' все равно насмехался, поэтому это был не производственный код. –

2

Использование ArgumentMatchers.isNull() подшивка.

when(supplier.calculateDeliveryDate(any(Date.class))) 
    .thenReturn(supplierDeliveryDate); 
when(supplier.calculateDeliveryDate(isNull())) 
    .thenReturn(null); 
+0

Похоже, что это может сработать, но мне нужно будет обновить нашу версию Mockito до 2. Это сломает весь код, который использует un-type-safe 'anyList()' и т. Д. –