1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/GiteeOS-springboot-guide

Клонировать/Скачать
PowerMockRunnerAndMockito.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 10:20 f496caa

Единичные тесты могут повысить эффективность разработки тестов, снизить количество ошибок в коде, улучшить устойчивость кода и повысить его качество. В фреймворке Spring обычно используются два типа тестовых фреймворков: PowerMockRunner и SpringRunner. В связи с проблемами запуска зависимости и подключения данных при использовании SpringRunner, рекомендуется использовать PowerMockRunner, что позволяет эффективно улучшить производительность тестирования, а также предоставляет API, которые охватывают широкий спектр сценариев и удобны в использовании, что делает его настоящим инструментом для моделирования в Java-единичных тестах.

1. Что такое PowerMock?

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>

3. Описание важных аннотаций

@RunWith(PowerMockRunner.class) // Сообщает JUnit использовать PowerMockRunner для тестирования
@PrepareForTest({RandomUtil.class}) // Список всех классов, которые нужно тестировать, для моделирования final классов или классов с final, private, static, native методами
@PowerMockIgnore("javax.management.*") // Для решения проблем с загрузчиком классов после использования powermock

4. Примеры использования

4.1 Мокирование интерфейсов

Сначала мокируем интерфейс, а затем записываем соответствующее поведение.

InterfaceToMock mock = PowerMockito.mock(InterfaceToMock.class);
PowerMockito.when(mock.method(Params)).thenReturn(value);
PowerMockito.when(mock.method(Params..)).thenThrow(Exception);

4.2 Установка приватных свойств объекта

Для установки приватных свойств объекта используется 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);
4.4 Мокирование статических методов

Мокирование статических методов похоже на мокирование конструктора и требует добавления соответствующих меток.

@RunWith(PowerMockRunner.class)
@PrepareForTest({ StaticClassToMock.class })
@PowerMockIgnore("javax.management.\*")

PowerMockito.mockStatic(StaticClassToMock.class);
PowerMockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value);
4.5 Мокирование final методов

Мокирование final методов похоже на мокирование статических методов.

@RunWith(PowerMockRunner.class)
@PrepareForTest({ FinalClassToMock.class })
@PowerMockIgnore("javax.management.\*")

PowerMockito.mockStatic(FinalClassToMock.class);
PowerMockito.when(StaticClassToMock.method(Object.. params)).thenReturn(Object value);

4.6 Мокирование статических классов

Мокирование статических классов похоже на мокирование статических методов.

4.7 Использование метода spy для избегания выполнения методов в тестируемом классе

Если тестируемый класс — это TargetClass, а метод, который нужно скрыть — это targetMethod.```java

  1. PowerMockito.spy(TargetClass.class);

  2. Powemockito.when(TargetClass.targetMethod()).thenReturn();

  3. Обратите внимание, необходимо добавить

@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);

5. Список рекомендаций для юнит-тестирования

Проверка входных данных: эти проверки обычно применяются к данным, вводимым в систему приложения.

  • Проверка обязательных параметров
  • Проверка уникальности значений полей
  • Проверка пустых значений
  • Проверка допустимых символов в полях
  • Проверка отрицательных значений
  • Проверка длины полей
  • Проверка невозможных значений
  • Проверка мусорных значений
  • Проверка зависимости между полями
  • Проверка эквивалентных классов и граничных условий
  • Проверка обработки ошибок и исключений ```Юнит-тестирование может повысить эффективность разработки тестов, снизить количество ошибок в коде, улучшить устойчивость кода и повысить его качество. В фреймворке Spring обычно используются два типа тестовых фреймворков: PowerMockRunner и `SpringRunner`. В связи с проблемами запуска и зависимости данных при использовании `SpringRunner`, рекомендуется использовать `PowerMockRunner`, что позволяет эффективно улучшить производительность тестирования и предоставляет широкий спектр сценариев, удобных для использования, что делает его мощным инструментом для имитации в Java-юнит-тестировании.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/GiteeOS-springboot-guide.git
git@api.gitlife.ru:oschina-mirror/GiteeOS-springboot-guide.git
oschina-mirror
GiteeOS-springboot-guide
GiteeOS-springboot-guide
master