Продвинутое тестирование с помощью Mockito
Сегодня мы познакомимся с продвинутым тестированием. А точнее с библиотекой Mockito. Даже и не думайте увильнуть от этого дела.
Во-первых, эта библиотека – это стандарт в тестирование Spring’а. Который фактически является стандартом в отрасли Java-backend разработки.
Во-вторых, тебе придется писать тесты для своего Spring-кода . Единственный способ понять, что написанный тобой бекенд работает как нужно – это вызывать методы его API . И сделать это с помощью тестов в 10 раз легче, чем без них. Ты сам в этом убедишься.
Добавить библиотеку Mockito в ваш pom.xml можно с помощью кода:
org.mockito mockito-junit-jupiter 4.2.0 test
Весь исходный код проекта Mockito можно найти на GitHub.
1.2 Mock-объекты
Так что же такое эта Mockito и чем она так хороша?
В процессе развития и становления тестирования очень часто возникала необходимость вместо реального объекта подсунуть коду какую-нибудь «заглушку».
Например, тестируется код, который работает с базой данных и что-то там меняет. Хорошо чтобы перед каждым тестом состояние этой базы было одним и тем же (иначе тесты будут разные). И базу хотелось бы попроще, чтобы быстро эти состояния откатывать.
Или, например, ты тестируешь код, который рассылает полезные SMS. А для непосредственно рассылок он использует какой-нибудь платный SMS Gateway. Хорошо бы для тестирования кода подсунуть ему некий виртуальный Gateway, чтобы не рассылать сотни SMS непонятно кому.
Или твой код запрашивает данные у других веб-серверов, которые банально недоступны на тестовом сервере. Или ты пишешь код для интернет-платежей, который нужно 50 раз протестировать, и только потом допускать к реальным финансовым каналам.
Думаю, вы поняли… Виртуальные объекты или как их еще называют объекты-заглушки очень полезная штука.
И тут возникает сложность – в Java-то статическая типизация. Значит, чтобы вместо объекта типа ReadDatabase присвоить переменной ссылку на объект VirtualDatabase , нужно унаследовать класс VirtualDatabase от RealDatabase .
Затем оказывается, что у класса RealDatabase куча приватных методов и переменных, которые хранят ссылки на другие реальные объекты, и нормальную заглушку таким образом не напишешь. В теории хороший, но на практике тупиковый вариант.
И тут нам на помощь приходит DynamicProxy (более подробно можно почитать), которые появились еще в Java 5. Она позволяет создавать виртуальные объекты, к которым у компилятора нет претензий.
Такие виртуальные объекты называют mock’ами (от слова mock – макет). Библиотека Mockito смогла вознести работу с этими моками на небывалую высоту. Отсюда, кстати, и название библиотеки.
1.3 Аннотация @ExtendWith
Библиотека Mockito отлично работает вместе с JUnit, ее можно даже рассматривать как его расширение.
Есть два способа активировать работу библиотеки Mockito в ваших unit-тестах. Первый способ – это добавить специальную аннотацию:
@ExtendWith(MockitoExtension.class) public class MockitoAnnotationTest
Второй способ – включить ее работу вызвав метод openMocks() :
public class MockitoAnnotationTest < @BeforeEach public void init() < MockitoAnnotations.openMocks(this); > >
Чаще всего ты будешь видеть первый вариант, но иногда полезно знать, что есть и второй.
What is mock testing in Java?
A Mock object is something used for unit testing. If you have an object whose methods you want to test, and those methods depend on some other object, you create a mock of the dependency rather than an actual instance of that dependency. This allows you to test your object in isolation.
What is a mock testing?
Mock testing is an approach to unit testing that lets you make assertions about how the code under test is interacting with other system modules. In mock testing, the dependencies are replaced with objects that simulate the behaviour of the real ones. Such a service can be replaced with a mock object.
What is mock data in Java?
Mocking in unit testing attempts to solve in an easy way the creation of fake objects that help the unit testing process. Mock objects sometimes remind me of the film “The Truman Show.” You use mocking in order to “fool” a Java object to think that it communicates with other real objects.
What does mock do in JUnit?
While doing unit testing using junit you will come across places where you want to mock classes. Mocking is done when you invoke methods of a class that has external communication like database calls or rest calls.
What is the purpose of mock testing?
What is mock testing? Mocking means creating a fake version of an external or internal service that can stand in for the real one, helping your tests run more quickly and more reliably. When your implementation interacts with an object’s properties, rather than its function or behavior, a mock can be used.
What is full form mock?
The Full Form of MOCK is Multiple option checking. MOCK. Multiple option checking.
How do I run a mock test?
2.2. Using Mockito for mocking objects
- Mock away external dependencies and insert the mocks into the code under test.
- Execute the code under test.
- Validate that the code executed correctly.
When should I mock?
Mock objects are useful when you want to test interactions between a class under test and a particular interface. For example, we want to test that method sendInvitations(MailServer mailServer) calls MailServer. createMessage() exactly once, and also calls MailServer.
Where can I download a mock test for Java?
What is the purpose of a mock Test?
Which is the best mocking framework for Java?
How to test a mock Dao in Mockito?