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