Пробный заключается в создании поддельного теста один из объектов в процессе существованиятеста, чтобы вам не приходилось строить весь процесс самостоятельно, чтобы один метод Bean цепочка зависимости.
Например:
Класс A должен вызывать класс B и класс C, а класс B и класс C должны вызывать другие классы, такие как D, E, F и т. д. Предполагая, что класс D является внешней службой, его будет сложно протестировать, потому что ваш возврат На результат будут напрямую влиять внешние службы, ваш модульный тест может пройти сегодня, но не завтра.
И когда мы представим Пробный тест, вы можете создать один ложный изобъект,заменитьреальностьиз Bean B и C, чтобы при вызове методов B и C действительно вызывался этот фейковый. Mock Метод объекта, и мы можем установить его сами Mock Объект из параметров и желаемого результата, что позволяет нам сосредоточиться на существующем тесте и желаемом результате. A, без влияния других внешних служб, что позволяет значительно повысить эффективность тестирования.
Mockito это своего рода Java Mock Фреймворк в основном используется для создания Пробный тестиз, он может имитировать любой Spring управление Компоненты, возвращаемые значения смоделированных методов, исключения, вызванные симуляцией и т. д., также будут записывать параметры и порядок вызова этих смоделированных методов, чтобы это можно было проверить. Mock Вызываются ли объекты в правильном порядке и с ожидаемыми параметрами.
Например, Mockito может имитировать данные, возвращаемые Сервисом при модульном тестировании, без фактического вызова Сервиса. Имитируя поддельный объект Сервиса, вы можете быстро протестировать класс, который хотите протестировать.
В настоящее время в Java мейнстрим Пробный инструмент тестирования имеет Mockito, JMock, EasyMock и т. д., в то время как SpringBoot Текущая среда тестирования по умолчанию: Mockito рамка.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Один UserService, два метода
@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]
public class User {
private Integer id;
private String name;
//пропуск getter/setter
}
Если мы не сделаем это сейчас, Мокито имитировать подделку userDao Бин,но на самом деле звонит нормально Spring Bean из userDao изразговаривать, инъекция userService Бина, а затем вызвать метод, и он вызовет еще раз userDao Получите данные базы данных, а затем мы делаем следующее с возвращенными результатами. Assert Проверка утверждений.
@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");
}
}
Но если userDao Я еще не закончил писать, но хочу сначала протестировать. userService из, вам нужно Использование Мокито идтиимитировать подделку userDao публично заявить.
Как это сделать конкретно?
Добавьте аннотацию @MockBean в userDao.
когда userDao После добавления этой аннотации это означает Mockito Поможет нам создать ложное из Mock объект, заменить Spring Уже сохранено в существовании, что реально из userDao Бин, то есть инъекция userService из userDao Бин, мы заменили его на false Mock Объект, поэтому, когда мы снова вызовем userService изметод при вызове на самом деле mock userDao Bean изметод, не настоящий из userDao Bean。
когда мы создали одну ложь из userDao назад,насдля этого нужно создать пользовательский метод userDao, возвращающий значение,Вот использование одной формулы,Следующий код означает,когдавызов кого-то Mock Когда объект изметод возвращается, мы хотим, чтобы из Пользовательские результаты。
Mockito.when( Имя Объекта.Метод() ).thenReturn( Пользовательские результаты )
Код выглядит следующим образом:
@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( Пользовательские результаты ), также предоставляет нам другие возможности использования.
когдаиспользоватьлюбое целое значениевызов userService из getUserById() При использовании метода имя единицы возвращается как Aritsaniz. User объект.
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 объект.
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。
Mockito.when(userService.insertUser(Mockito.any(User.class))).thenReturn(100);
Integer i = userService.insertUser(new User()); // вернет 100
когдавызов userService из getUserById() Время из параметра 9 когда, бросить RuntimeException。
Mockito.when(userService.getUserById(9)).thenThrow(new RuntimeException("фиктивное исключение вызова"));
Пользователь пользователя = userService.getUserById(9); //встреча БросатьодинRuntimeException
Если метод не имеет возвращаемого значения (то есть метод определен как public void myMethod() {...}), воспользуйтесь вместо этого doThrow() Бросать исключение.
Mockito.doThrow(new RuntimeException("исключение фиктивного вызова")).when(userService).print();
userService.print(); //встреча БросатьодинRuntimeException
Проверьте звонок userService из getUserById(), и параметр равен 3, если количество раз равно 1.
Mockito.verify(userService, Mockito.times(1)).getUserById(Mockito.eq(3)) ;
Проверьте последовательность вызовов, проверьте userService Стоит ли звонить первым getUserById() дважды, и первый раз из параметра 3. Второй из параметров 5. Затем вызовите метод InsertUser(). метод.
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 из Степень сцепления.