JavaRush /Курсы /JSP & Servlets /Популярные сценарии работы с Mockito

Популярные сценарии работы с Mockito

JSP & Servlets
4 уровень , 5 лекция
Открыта

6.1 Мокирование статического метода mockStatic()

И еще один важный момент – мокирование и верификация статических методов. “А что в этом такого?”, – спросишь ты. Да, статические, но ведь методы же. И будете неправы.

Помни, с чего мы начали изучение мок-объектов? С того, что эти объекты искусственно создаются через класс DynamicProxy. А статические методы ни к каким объектам не привязаны и перехватить вызовы к ним через DynamicProxy нельзя. Вот и все.

Но создатели Mockito и тут смогли извернуться – написали свой загрузчик классов и с его помощью смогли подменять классы на лету. Большая и сложная работа, но они все-таки смогли это сделать.

Понадобится добавить дополнительную библиотеку в pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.2.0</version>
    <scope>test</scope>
</dependency>

Вот как нужно работать, если вам нужно мокировать статический метод.

1 Создаем специальный мок-объект класса:

MockedStatic<ИмяКласса>управляющийОбъект = Mockito.mockStatic(ИмяКласса.class);

2 Добавляем к этому объекту правила работы:

К этому объекту правила нужно цеплять другими способами.

управляющийОбъект.when(ИмяКласса::имяМетода).thenReturn(результат);

3 Обязательно заворачиваем использование этого объекта в try-with-resources, чтобы объект сразу удалился и Mockito могло очистить связанные с ним правила.

Пример:


@Test
void givenStaticMethodWithNoArgs () {
    try (MockedStatic< StaticUtils> utilities =  Mockito.mockStatic( StaticUtils.class)) {
        //добавляем правило
  utilities.when(StaticUtils::name).thenReturn("Привет");  

        //проверяем, что правило работает
        assertEquals("Привет", StaticUtils.name());
    }
}

Не так красиво, как с аннотациями @Mock и @Spy, зато очень практично. Было очень тяжело писать тесты, когда нельзя было замокать простой статический метод, который использовался внутри тестируемых методов.


Еще немного о Mockito. И ответы на вопросы

Комментарии (11)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Максим Уровень 1
19 сентября 2025
Ору, вставляют видео лекцию в конце статьи со статическми методами. Также цитата из видео: "а показать, как мокать статический метод, мы не можем"👍
Mitrus Latovous Уровень 41
27 октября 2023
Отлично! А мне, то как раскрыта тема тестирования, очень понравилось.
Mikhail Уровень 1
16 июля 2023
И так сойдёт.
Gregory Parfer Уровень 82 Expert
29 января 2023
Кто не очень разобрался, можете посмотреть тут.
hidden #2788915 Уровень 35
13 июня 2023
Огонь! Спасибо!
Юлия Уровень 108 Expert
14 января 2023
не забывайте завернуть всю конструкцию в try-with-resources,и будет вам счастье...
Александр Уровень 117
12 января 2023
Не знаю как, но у меня получилось)))
Stas S Уровень 108 Expert
8 сентября 2022
Может кому-нибудь поможет
Nikita Shamrai Уровень 8 Expert
27 июля 2022
Я потратил уже 4 часа в попытках разобраться с тестированием статического метода в проекте в конце. Ставлю 1 звезду, т.к на основе этой лекции разобраться невозможно.
Екатерина Уровень 70 Expert
19 ноября 2022
+1