Единичные тесты могут повысить эффективность разработки тестов, снизить количество ошибок в коде, улучшить устойчивость кода и повысить его качество. В фреймворке Spring обычно используются два типа тестовых фреймворков: PowerMockRunner
и SpringRunner
. В связи с проблемами запуска зависимости и подключения данных при использовании SpringRunner
, рекомендуется использовать PowerMockRunner
, что позволяет эффективно улучшить производительность тестирования, а также предоставляет API, которые охватывают широкий спектр сценариев и удобны в использовании, что делает его настоящим инструментом для моделирования в Java-единичных тестах.
PowerMock
— это Java-фреймворк для моделирования, который позволяет решать проблемы тестирования, которые обычно считаются сложными или даже невозможными. С помощью PowerMock
можно моделировать статические методы, удалять статическую инициализацию, позволять моделирование без зависимости от внедрения и т. д. PowerMock
использует модификацию байт-кода на лету во время выполнения тестов для выполнения этих трюков. PowerMock
также включает в себя некоторые утилиты, которые позволяют легче получить доступ к внутреннему состоянию объектов.Например, если вы используете JUnit
для единичных тестов и не хотите, чтобы тестовые данные попадали в базу данных, вы можете использовать PowerMock
, чтобы перехватить операции с базой данных и моделировать возврат параметров.## 2. Введение зависимостей PowerMock
<!-- Зависимости для единичных тестов -->
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.23.0</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.jsonzou</groupId>
<artifactId>jmockdata</artifactId>
<version>4.3.0</version>
</dependency>
@RunWith(PowerMockRunner.class) // Сообщает JUnit использовать PowerMockRunner для тестирования
@PrepareForTest({RandomUtil.class}) // Список всех классов, которые нужно тестировать, для моделирования final классов или классов с final, private, static, native методами
@PowerMockIgnore("javax.management.*") // Для решения проблем с загрузчиком классов после использования powermock
Сначала мокируем интерфейс, а затем записываем соответствующее поведение.
InterfaceToMock mock = PowerMockito.mock(InterfaceToMock.class);
PowerMockito.when(mock.method(Params…)).thenReturn(value);
PowerMockito.when(mock.method(Params..)).thenThrow(Exception);
Для установки приватных свойств объекта используется Whitebox
.
Если мы уже мокировали интерфейс, и теперь хотим добавить этот мок в объект, можно использовать следующий метод:```java Whitebox.setInternalState(Object object, String fieldname, Object… value);
Здесь `object` — это статический класс или объект, для которого нужно установить свойство.
### 4.3 Мокирование конструктора
Для мокирования конструктора, то есть когда используется `new InstanceClass()`, можно перехватить этот конструктор и заменить результат на нужный мок.
Внимание: при использовании необходимо добавить метки:
```java
@RunWith(PowerMockRunner.class)
@PrepareForTest({ InstanceClass.class })
@PowerMockIgnore("javax.management.\*")
PowerMockito.whenNew(InstanceClass.class).thenReturn(Object value);
Мокирование статических методов похоже на мокирование конструктора и требует добавления соответствующих меток.
@RunWith(PowerMockRunner.class)
@PrepareForTest({ StaticClassToMock.class })
@PowerMockIgnore("javax.management.\*")
PowerMockito.mockStatic(StaticClassToMock.class);
PowerMockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value);
Мокирование final методов похоже на мокирование статических методов.
@RunWith(PowerMockRunner.class)
@PrepareForTest({ FinalClassToMock.class })
@PowerMockIgnore("javax.management.\*")
PowerMockito.mockStatic(FinalClassToMock.class);
PowerMockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value);
Мокирование статических классов похоже на мокирование статических методов.
Если тестируемый класс — это TargetClass
, а метод, который нужно скрыть — это targetMethod
.```java
PowerMockito.spy(TargetClass.class);
Powemockito.when(TargetClass.targetMethod()).thenReturn();
Обратите внимание, необходимо добавить
@RunWith(PowerMockRunner.class) @PrepareForTest(DisplayMoRelationBuilder.class) @PowerMockIgnore("javax.management.*")
Иногда при работе с `doMethod(Param param)` мы не хотим использовать точное совпадение и можем воспользоваться методом нечеткого совпадения, предоставляемым `Mockito`.
Например: `Mockito.anyInt()`, `Mockito.anyString()`
### 4.9 Обработка публичных статических методов типа `public void`
```java
PowerMockito.doNothing().when(T class2mock, String method, <T>... params);
Проверка входных данных: эти проверки обычно применяются к данным, вводимым в систему приложения.
PowerMockRunner
и `SpringRunner`. В связи с проблемами запуска и зависимости данных при использовании `SpringRunner`, рекомендуется использовать `PowerMockRunner`, что позволяет эффективно улучшить производительность тестирования и предоставляет широкий спектр сценариев, удобных для использования, что делает его мощным инструментом для имитации в Java-юнит-тестировании.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )