Вы можете использовать анонимный внутренний класс:
// 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);
}
}
Но вы действительно должны задаться вопросом, почему вам нужен этот вид поведения.
Если вы пишете четко определенный тестовый пример, вы должны точно знать, как часто и с какими аргументами вызывается ваш макет. Если это так, вы можете просто заглушить ожидаемые вызовы, а не подключать свой макет с условным поведением.
Обратите внимание, что это полезно, если ваш тест как можно более «резкий». Если разное количество вызовов достигает вашего макета, чем ожидалось, или с разными аргументами, тогда тест должен завершиться неудачно.
К сожалению, ваш пример кода не связаны с вопросом, так как он изменяет поведение производственного кода, а не тестовый код, как запрошено ОП. но мне нравится ваше заявление в вашем ответе. Я бы проголосовал, если вы удалите пример ... –
@Adriaan Я добавляю к существующему тесту. Тест проходит, когда заданная дата имеет значение NULL, но производственный код заканчивается выбросом исключения NullPointerException. Я хотел бы внести минимальные изменения в существующий тест, но попробуйте проверить этот случай null Date. –
@TimothyTruckle 'Supplier.calculateDeliveryDate (...)' все равно насмехался, поэтому это был не производственный код. –