Тестирование с функциями, переданными в макет объекта

#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(...);
}