Что такое пробный тест
Мок-тестирование — это метод тестирования, использующий виртуальный объект для создания метода тестирования для тестирования некоторых объектов, которые нелегко создать или получить в процессе тестирования. Что такое объект, который нелегко построить? Например, HttpServletRequest необходимо создать в среде контейнера сервлетов. А как насчет труднодоступных объектов? Например, JedisCluster необходимо подготовить среду, связанную с redis, а затем настроить ее и так далее.
Mock может разлагать другие классы или интерфейсы, которые связаны в модульных тестах, он может помочь вам имитировать эти зависимости и помочь вам проверить поведение вызываемых зависимостей.
пример сцены
Когда нам нужно протестировать OrderService, в соответствии с нашей обычной практикой, мы должны сначала подготовить среду Redis и db, а затем создать UserService и CouponService для внедрения. На этом этапе нам нужно построить полное дерево зависимостей, которое представляет собой утомительный процесс. , в случае, если база данных не может быть подключена, зависимости не могут быть найдены, сервис зависает... Со временем это может ослабить наш энтузиазм к одиночному тестированию проекта, поэтому необходимо найти элегантный способ решить эту проблему в настоящее время.
Clang clang ~ В это время появился Mockito (в java есть много Mock-фреймворков, но эта статья только знакомит с этим), он преобразует все эти утомительные зависимости в Mock Objects, как показано ниже, чтобы мы могли сосредоточиться на нашей работе. Одиночный тест , сокращая время, затрачиваемое на разрешение зависимостей.
сушить напрямую
Введение Mockito не будет повторяться здесь.Если вам интересно, вы можете перейти к официальной документации, чтобы проверить это.Здесь мы в основном познакомим вас с некоторыми часто используемыми методами Mock.
maven-зависимости
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.23.4</version>
<scope>test</scope>
</dependency>
Для удобства тестирования кода напрямую импортируйте статически в тестовом классе import static org.mockito.Mockito.*;
основной метод
@Test
public void testMockBase(){
//创建ArrayList的Mock对象
List mockList = mock(ArrayList.class);
//pass
Assert.assertTrue(mockList instanceof ArrayList);
//当我们mockList调用方法去add("张三")的时候会返回true
when(mockList.add("张三")).thenReturn(true);
//当我们mockList调用方法size()的时候返回10
when(mockList.size()).thenReturn(10);
//pass
Assert.assertTrue(mockList.add("张三"));
//pass
Assert.assertFalse(mockList.add("李四"));
//pass
Assert.assertEquals(mockList.size(),10);
//null
System.out.println(mockList.get(0));
}
Имитация статического метода создаст объект Mock.Поскольку объект Mock фактически не выполняет код в методе, значение по умолчанию будет возвращено, если возвращаемое значение не указано (например, строка 19). В девятой и десятой строках мы указываем значение, которое mockList должен вернуть после выполнения определенного метода, поэтому проверка assertTrue не представляет проблемы, но add("Li Si") мы его не устанавливали, поэтому оно ложно.
Вызовы методов проверки
//使用mock
List mockedList = mock(ArrayList.class);
mockedList.add("once");
mockedList.add("twice");
mockedList.add("twice");
mockedList.add("three times");
mockedList.add("three times");
mockedList.add("three times");
//这里默认是判断该方法调用times(1),同下
verify(mockedList).add("once");
verify(mockedList, times(1)).add("once");
verify(mockedList, times(2)).add("twice");
verify(mockedList, times(3)).add("three times");
//从没调用,times(0)
verify(mockedList, never()).add("never happened");
//最少一次,最少几次,最多几次
verify(mockedList, atLeastOnce()).add("three times");
verify(mockedList, atLeast(2)).add("three times");
verify(mockedList, atMost(5)).add("three times");
На самом деле в приведенном выше коде именование более интуитивное, поэтому я буду комментировать его прямо в коде.
Проверить продолжительность вызова метода
//方法执行在100ms以内的时候可以通过
verify(mock, timeout(100)).someMethod();
//同上
verify(mock, timeout(100).times(1)).someMethod();
//方法2次调用均没超过100ms
verify(mock, timeout(100).times(2)).someMethod();
verify(mock, timeout(100).atLeast(2)).someMethod();
Благодаря обнаружению тайм-аута мы можем проверить, будут ли проблемы с логикой нашего метода и вызывать тайм-ауты.
сопоставление параметров
linkedList.add("element");
// anyInt() 任何整数我们都返回 element
when(linkedList.get(anyInt())).thenReturn("element");
System.out.print(linkedList.get(10));//返回element
метод выдает исключение
@Test(expected = RuntimeException.class)
public void doThrow(){
List list = mock(List.class);
doThrow(new RuntimeException()).when(list).add(1);
list.add(1);
}
Использование внедрения аннотаций
public class ArticleManagerTest {
@Mock private ArticleCalculator calculator;
@Mock private ArticleDatabase database;
@Mock private UserProvider userProvider;
private ArticleManager manager;
Следует отметить, что если мы используем его по аннотации, мы должны добавить код для инициализации макета, иначе он будет нулевым, даже если аннотация помечена.
MockitoAnnotations.initMocks(testClass);
Для более подробного использования Mockito вы можете напрямую обратиться к официальной документации, потому что действительно есть много «волшебных трюков», а поддержка лямбды java8 будет обновлена позже. Многие функции все еще ожидают от вас изучения ~
Для более подробного использования, пожалуйста, обратитесь непосредственно к официальной документации:
static.Java doc.IO/org.mock ITO…
Я считаю, что когда вы будете умело использовать Mockito, вам понравится писать одиночные тесты, и это также повысит надежность вашего кода. Если какие-то баги можно найти заранее, это лучше, чем вызываться посреди ночи, чтобы исправлять их на ходу, верно?
Если вам это нравится, обратите внимание на публичный аккаунт WeChat «Program Ape in the Night» и делитесь лучшими галантерейными товарами каждый день.