SpringBoot — начало работы с Mockito, инструментом модульного тестирования.
SpringBoot — начало работы с Mockito, инструментом модульного тестирования.

Каталог статей


Пробный тест

Пробный заключается в создании поддельного теста один из объектов в процессе существованиятеста, чтобы вам не приходилось строить весь процесс самостоятельно, чтобы один метод Bean цепочка зависимости.

Например:

Класс A должен вызывать класс B и класс C, а класс B и класс C должны вызывать другие классы, такие как D, E, F и т. д. Предполагая, что класс D является внешней службой, его будет сложно протестировать, потому что ваш возврат На результат будут напрямую влиять внешние службы, ваш модульный тест может пройти сегодня, но не завтра.

И когда мы представим Пробный тест, вы можете создать один ложный изобъект,заменитьреальностьиз Bean B и C, чтобы при вызове методов B и C действительно вызывался этот фейковый. Mock Метод объекта, и мы можем установить его сами Mock Объект из параметров и желаемого результата, что позволяет нам сосредоточиться на существующем тесте и желаемом результате. A, без влияния других внешних служб, что позволяет значительно повысить эффективность тестирования.


What’s Mockito

Mockito это своего рода Java Mock Фреймворк в основном используется для создания Пробный тестиз, он может имитировать любой Spring управление Компоненты, возвращаемые значения смоделированных методов, исключения, вызванные симуляцией и т. д., также будут записывать параметры и порядок вызова этих смоделированных методов, чтобы это можно было проверить. Mock Вызываются ли объекты в правильном порядке и с ожидаемыми параметрами.

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

В настоящее время в Java мейнстрим Пробный инструмент тестирования имеет Mockito, JMock, EasyMock и т. д., в то время как SpringBoot Текущая среда тестирования по умолчанию: Mockito рамка.


Использование Мокито

зависимость от помпа

Язык кода:javascript
копировать
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

Demo Code

Один UserService, два метода

  • getUserById() -------------> вызов UserDao этот beanиз getUserById()
  • insertUser() -------------> вызов UserDao этот beanиз insertUser()
Язык кода:javascript
копировать
@Component
public class UserService {
    
    @Autowired
    private UserDao userDao;

    public User getUserById(Integer id) {
        return userDao.getUserById(id);
    }

    public Integer insertUser(User user) {
        return userDao.insertUser(user);
    }
}

[объект POJO]

Язык кода:javascript
копировать
public class User {
    private Integer id;
    private String name;
    //пропуск getter/setter
}

【Общие операции】

Если мы не сделаем это сейчас, Мокито имитировать подделку userDao Бин,но на самом деле звонит нормально Spring Bean из userDao изразговаривать, инъекция userService Бина, а затем вызвать метод, и он вызовет еще раз userDao Получите данные базы данных, а затем мы делаем следующее с возвращенными результатами. Assert Проверка утверждений.

Язык кода:javascript
копировать
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    // пункт назначения обычный изинъекцияодинuserService bean
    @Autowired
    private UserService userService;

    @Test
    public void getUserById() throws Exception {
        //Обычный изиспользоватьuserService, который потом пойдет на вызовuserDao для получения базы данных из данных
        User user = userService.getUserById(1);
        
        //Проверяем результаты
        Assert.assertNotNull(user);
        Assert.assertEquals(user.getId(), new Integer(1));
        Assert.assertEquals(user.getName(), "John");
    }
}

【Mockito】

Но если userDao Я еще не закончил писать, но хочу сначала протестировать. userService из, вам нужно Использование Мокито идтиимитировать подделку userDao публично заявить.

Как это сделать конкретно?

Добавьте аннотацию @MockBean в userDao.

когда userDao После добавления этой аннотации это означает Mockito Поможет нам создать ложное из Mock объект, заменить Spring Уже сохранено в существовании, что реально из userDao Бин, то есть инъекция userService из userDao Бин, мы заменили его на false Mock Объект, поэтому, когда мы снова вызовем userService изметод при вызове на самом деле mock userDao Bean изметод, не настоящий из userDao Bean。

когда мы создали одну ложь из userDao назад,насдля этого нужно создать пользовательский метод userDao, возвращающий значение,Вот использование одной формулы,Следующий код означает,когдавызов кого-то Mock Когда объект изметод возвращается, мы хотим, чтобы из Пользовательские результаты。

Язык кода:javascript
копировать
Mockito.when( Имя Объекта.Метод() ).thenReturn( Пользовательские результаты )

Код выглядит следующим образом:

Язык кода:javascript
копировать
@RunWith(SpringRunner.class)
@SpringBootTest
publicclass UserServiceTest {
    
    @Autowired
    private UserService userService;
    
    @MockBean
    private UserDao userDao;

    @Test
    public void getUserById() throws Exception {
        // Определение когдавызовmock userDaoизgetUserById(), параметр — 3, возвращаемый идентификатор — 200, имя — I’m объект mock3izuser
        Mockito.when(userDao.getUserById(3)).thenReturn(new User(200, "Aritisan"));
        
        // Возвращение будет называться «Я» mock 3изпользовательского объекта
        User user = userService.getUserById(1);

        Assert.assertNotNull(user);
        Assert.assertEquals(user.getId(), new Integer(200));
        Assert.assertEquals(user.getName(), "Aritisan");
    }
}

Mockito За исключением самого элементарного Mockito.when( Имя Объекта.Метод() ).thenReturn( Пользовательские результаты ), также предоставляет нам другие возможности использования.


thenReturn

когдаиспользоватьлюбое целое значениевызов userService из getUserById() При использовании метода имя единицы возвращается как Aritsaniz. User объект.

Язык кода:javascript
копировать
Mockito.when(userService.getUserById(Mockito.anyInt())).thenReturn(new User(3, "Aritisan"));
User user1 = userService.getUserById(3); // Ответ изuserizname: Aritsan.
User user2 = userService.getUserById(200); // Возвращенное имя изuseriz также является Aritisan.

Ограничения толькокогдапараметриз Число 3 Когда имя будет возвращено как Aritisan из user объект.

Язык кода:javascript
копировать
Mockito.when(userService.getUserById(3)).thenReturn(new User(3, "Aritisan"));
User user1 = userService.getUserById(3); // Ответ изuserizname: Aritsan.
User user2 = userService.getUserById(200); // Возвращенный пользователь имеет значение null

когдавызов userService из insertUser() Когда метод, независимо от того, что приходит из user Что бы это ни было, отправь это обратно 100。

Язык кода:javascript
копировать
Mockito.when(userService.insertUser(Mockito.any(User.class))).thenReturn(100);
Integer i = userService.insertUser(new User()); // вернет 100

thenThrow

когдавызов userService из getUserById() Время из параметра 9 когда, бросить RuntimeException。

Язык кода:javascript
копировать
Mockito.when(userService.getUserById(9)).thenThrow(new RuntimeException("фиктивное исключение вызова"));
Пользователь пользователя = userService.getUserById(9); //встреча БросатьодинRuntimeException

Если метод не имеет возвращаемого значения (то есть метод определен как public void myMethod() {...}), воспользуйтесь вместо этого doThrow() Бросать исключение.

Язык кода:javascript
копировать
Mockito.doThrow(new RuntimeException("исключение фиктивного вызова")).when(userService).print();
userService.print(); //встреча БросатьодинRuntimeException

verify

Проверьте звонок userService из getUserById(), и параметр равен 3, если количество раз равно 1.

Язык кода:javascript
копировать
Mockito.verify(userService, Mockito.times(1)).getUserById(Mockito.eq(3)) ;

Проверьте последовательность вызовов, проверьте userService Стоит ли звонить первым getUserById() дважды, и первый раз из параметра 3. Второй из параметров 5. Затем вызовите метод InsertUser(). метод.

Язык кода:javascript
копировать
InOrder inOrder = Mockito.inOrder(userService);
inOrder.verify(userService).getUserById(3);
inOrder.verify(userService).getUserById(5);
inOrder.verify(userService).insertUser(Mockito.any(User.class));

Мокито Заметки

Вышеупомянутое Mockito из Mock объектиспользоватьметод,Но когда Использование Мокито существовать Mock объектов, существуют некоторые ограничения, которых необходимо придерживаться:

  • Невозможно имитировать статические методы
  • Невозможно имитировать частные методы
  • Невозможно издеваться над финальным классом

Поэтому существуют при написании кода,Нужно сделать хорошее функциональное разделение,Только тогда Использование Мокито из Mock технология, которая поможет нам сократить время тестирования Bean из Степень сцепления.


boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]