Насмешка класса с помощью метода @Transactional с помощью Mockito - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть служба, компонент, содержащий метод @Transactional:

public class InMessageService {

...

    @Transactional

    public boolean retryInMessage(String messageId) {

    ...

    }

}

Для тестирования я пытаюсь смоделировать эту службу с помощью Mockito:

@Bean
@Primary
public InMessageService inMessageService() {
    return Mockito.mock(InMessageService.class);
}

Результатом этого является следующее исключение при запуске теста:

   Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB
subclass of class somePackage.InMessageService$MockitoMock$156222813: Common
causes of this problem include using a final class or a non-visible class;nested exception is
org.springframework.cglib.core.CodeGenerationException: java.lang.NoClassDefFoundError-->
somePath/InMessageService$MockitoMock$156222813

Хочу отметить, что один и тот же код работал с spring-boot 1.2.1 и Mockito 1.10.19.Я пытаюсь запустить приведенный выше код с весенней загрузкой 2.1.1 и Mockito 2.23.0

Мои наблюдения пока:

  • Независимо от того, какая версия Mockito между 2.1.0 и 2.23.0 Я пользуюсь, исключение такое же.Я не могу (и не хочу) использовать более старые версии Mockito, так как проект больше не компилируется
  • Если временно удалить аннотацию @Transactional, исключение не выдается.

Есть идеи, что нужно отрегулировать при обновлении пружинной загрузки, чтобы тесты снова заработали?

Спасибо!

1 Ответ

0 голосов
/ 09 февраля 2019

Начиная с версии 2.1.0 Mockito сохраняет аннотации для прокси-методов.Это означает, что Spring пытается проксировать фиктивный класс, который объявляет транзакционную аннотацию, и это терпит неудачу, потому что метод mocking является окончательным.

До этого Mockito удалял эти аннотации, что вызвало бы сбой любого реального вызова метода из-заотсутствующая транзакция.

Чтобы избежать этого, вам нужно будет удалить аннотации макета.Вы можете сделать это, используя MockSettings.withoutAnnotations.

...