Используйте Mockito для имитации методов, тип возвращаемого значения которых равен void.
Используйте Mockito для имитации методов, тип возвращаемого значения которых равен void.

Если во время разработки некоторые зависимые интерфейсы еще не разработаны и некоторые интерфейсы невозможно настроить, вы можете использовать Mockito для макетирования интерфейсов, а затем протестировать логику, что очень легко использовать.

В недавней разработке я использовал метод Mock для типов возвращаемых значений void. Я увидел хорошую статью и перевел ее, надеюсь, она будет полезна всем.

-------------------------------------------------- -----Великолепная разделительная линия------------------------------------------ ---------------

1. Обзор

Основное содержание этой статьи — использование Mockito для имитации методов без возвращаемых значений.

Ниже приведен класс, подготовленный к тестированию.

Язык кода:javascript
копировать
public class MyList extends AbstractList {
  
    @Override
    public void add(int index, String element) {
        // no-op
    }
}

2. Простое издевательство и проверка

доступный MockitoизdoNothing(), doThrow() и doAnswer(). Для имитации и проверки функций без возвращаемых значений.

Язык кода:javascript
копировать
@Test
public void whenAddCalledVerfied() {
    MyList myList = mock(MyList.class);
    doNothing().when(myList).add(isA(Integer.class), isA(String.class));
    myList.add(0, "");
  
    verify(myList, times(1)).add(0, "");
}

Однако вMockitoсерединаdoNothing() Это поведение по умолчанию для имитирующих методов без возвращаемых значений.

Следующий код эквивалентен приведенному выше

Язык кода:javascript
копировать
@Test
public void whenAddCalledVerfied() {
    MyList myList = mock(MyList.class);
    myList(0, "");
  
    verify(myList, times(1)).add(0, "");
}

DoThrow() сгенерирует исключение

Язык кода:javascript
копировать
@Test(expected = Exception.class)
public void givenNull_AddThrows() {
    MyList myList = mock(MyList.class);
    doThrow().when(myList).add(isA(Integer.class), isNull());
  
    myList.add(0, null);
}

будет представлен нижеdoAnswer()

3. Получение параметров

переписатьdoNothing() Важной причиной такого поведения по умолчанию является получение параметров.

Как в примере из части 2,проходитьverify() Проверено, что параметры были переданы в функцию add().

Итак, что, если нам нужно получить параметры, чтобы сделать что-то еще?

Еще нужно использоватьdoNothing() ,Просто нужно использоватьArgumentCaptor。

Язык кода:javascript
копировать
@Test
public void whenAddCalledValueCaptured() {
    MyList myList = mock(MyList.class);
    ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class);
    doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
    myList.add(0, "captured");
  
    assertEquals("captured", valueCapture.getValue());
}

4. Создайте ответ на метод с типом возврата void.

Метод может быть чем-то большим, чем просто добавление значения. Это когда вам нужно использовать Answer класс, чтобы добавить другие нужные нам варианты поведения.

Язык кода:javascript
копировать
@Test
public void whenAddCalledAnswered() {
    MyList myList = mock(MyList.class);
    doAnswer((Answer) invocation -> {
        Object arg0 = invocation.getArgument(0);
        Object arg1 = invocation.getArgument(1);
         
        assertEquals(3, arg0);
        assertEquals("answer me", arg1);
        return null;
    }).when(myList).add(any(Integer.class), any(String.class));
    myList.add(3, "answer me");

Здесь также поддерживаются лямбда-выражения.

5. Частичный макет

 MockitoизdoCallRealMethod() Метод доступен для функции void.

Язык кода:javascript
копировать
@Test
public void whenAddCalledRealMethodCalled() {
    MyList myList = mock(MyList.class);
    doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
    myList.add(1, "real");
  
    verify(myList, times(1)).add(1, "real");
}

Эта функция позволяет нам вызывать фактические методы исходного объекта, а также вызывать проверку.

6. Заключение

В этой статье представлены четыре метода в Mockito для имитации функций, возвращающих значения void.

Оригинальный текст на английском языке:https://www.baeldung.com/mockito-void-methods

исходный код:https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito

boy illustration
Статья длиной в 9000 слов знакомит вас с процессом запуска SpringBoot — самым подробным процессом запуска SpringBoot в истории — с изображениями и текстом.
boy illustration
Как настроить размер экрана в PR. Учебное пособие по настройке размера видео в PR [подробное объяснение]
boy illustration
Элегантный и мощный: упростите операции ElasticSearch с помощью easy-es
boy illustration
Проект аутентификации по микросервисному токену: концепция и практика
boy illustration
【Java】Решено: org.springframework.http.converter.HttpMessageNotWritableException.
boy illustration
Изучите Kimi Smart Assistant: как использовать сверхдлинный текст, чтобы открыть новую сферу эффективной обработки информации
boy illustration
Начало работы с Docker: использование томов данных и монтирования файлов для хранения и совместного использования данных
boy illustration
Использование Python для реализации автоматической публикации статей в публичном аккаунте WeChat
boy illustration
Разберитесь в механизме и принципах взаимодействия потребителя и брокера Kafka в одной статье.
boy illustration
Spring Boot — использование Resilience4j-Circuitbreaker для реализации режима автоматического выключателя_предотвращения каскадных сбоев
boy illustration
13. Springboot интегрирует Protobuf
boy illustration
Примечание. Инструмент управления батареями Dell Dell Power Manager
boy illustration
Общая интерпретация класса LocalDate [java]
boy illustration
[Базовые знания ASP.NET Core] -- Веб-API -- Создание и настройка веб-API (1)
boy illustration
Настоящий бой! Подключите Passkey к своему веб-сайту для безопасного входа в систему без пароля.
boy illustration
Руководство по настройке Nginx: как найти, интерпретировать и оптимизировать настройки Nginx в Linux
boy illustration
Typecho отображает использование памяти сервера
boy illustration
Как вставить элемент перед указанным ключом в ассоциативный массив в PHP
boy illustration
swagger2 экспортирует API как текстовый документ (реализация Java) [легко понять]
boy illustration
Выбор фреймворка nodejs Express koa egg MidwayJS сравнение NestJS
boy illustration
Руководство по загрузке, установке и использованию SVN «Рекомендуемая коллекция»
boy illustration
Интерфейс PHPforwarding_php отправляет запрос на получение
boy illustration
Создавайте и защищайте связь в реальном времени с помощью SignalR и Azure Active Directory.
boy illustration
ВичатПубличная платформаразвивать(три)——ВичатQR-кодгенерировать&Сканировать кодсосредоточиться на
boy illustration
[Углубленное понимание Java IO] Используйте InputStreamReader для чтения содержимого файла и легкого выполнения задач преобразования текста.
boy illustration
сравнение строк PHP
boy illustration
9 сценариев асинхронного сбоя @Async
boy illustration
Эффективная обработка запланированных задач: углубленное изучение секретов библиотеки APScheduler на Python
boy illustration
Рекомендации по облегченному артефакту развязки внутренних компонентов Spring Event (событие Spring)
boy illustration
Go: Лесоруб-лесоруб на колесах Введение