#java #junit #mockito
#java #junit #mockito
Вопрос:
У меня есть простая функция, которая недавно была дополнена некоторой дополнительной логикой. Я борюсь с обновлением тестовой логики, поскольку неожиданно тело метода обернуто в макет.
Позвольте мне привести вам пример.
Прежняя логика и тест:
// lo&ic
public void doSomethin&(Transaction t, int a) {
myService.foo(t, a);
}
И мой тест:
// test
TestedService service;
@Mock
MyService myService;
@Mock
Transaction t;
@Test
public void testSomethin&() {
testedService.doSomethin&(t, 10);
Mockito.verify(myService).foo(t, 10);
}
Произошло то, что мы обернули нашу логику в какую-то дополнительную функцию:
public void doSomethin&(Transaction t, int a) {
model.runInEnhancedTransaction(t, t2 -&&t; { myService.foo(t2, a) });
}
Мой вопрос в том, как мне проверить это, когда логика внезапно обернута в model
метод (модель в моем тесте является макетом).
Мне в основном нужно проверить, что t2 -&&t; { myService.foo(t2, a) }
было вызвано, когда model
объект является макетом.
РЕДАКТИРОВАТЬ: я заставил это работать с реализацией моей пользовательской версии model
только для целей тестирования, но все еще задаюсь вопросом, есть ли какой-нибудь более элегантный способ.
Комментарии:
1. Откуда
model
берется?2. Это просто еще один сервис, внедренный в класс таким же образом, как
MyService
. В тесте это макет.
Ответ №1:
Довольно сложно тестировать такого рода вызовы lambda. Что я делаю, так это выполняю два теста: один, который model.runInEnhancedTransaction()
был вызван, и один для model.runInEnhancedTransaction()
самого себя. например
@Test
void doSomethin&CallsModelEnhancedTransaction() {
testedService.doSomethin&(t, 10);
verify(model).runInEnhancedTransaction(eq(t), any());
}
@Test
void modelRunInEnhancedTransaction() {
Transaction t = mock(Transaction.class);
BiConsumer<Transaction, Inte&er&&t; consumer = mock(Biconsumer.class);
model.runInEnhancedTransaction(t, consumer);
verify(consumer).accept(...);
}