Автор оригинала: Pankaj Kumar.
Mockito позволяет нам создавать макеты объектов. Поскольку статический метод принадлежит классу, в Mockito нет возможности имитировать статические методы. Однако мы можем использовать PowerMock вместе с платформой Mockito для моделирования статических методов.
Mockito Имитирует статический метод с использованием PowerMock
PowerMock предоставляет различные модули для расширения платформы Mockito и запуска тестовых примеров JUnit и TestNG.
Обратите внимание, что PowerMock еще не поддерживает JUnit 5, поэтому мы создадим тестовые случаи JUnit4. Мы также узнаем, как интегрировать тестирование с Mockito и PowerMock.
Зависимости PowerMock
Нам нужны следующие зависимости PowerMock для насмешливых статических методов в Mockito.
powermock-api-mockito 2
: Это основная зависимость PowerMock, используемая для расширения платформы насмешек Mockito 2. Если вы используете версии Mockito 1.x, используйтеpowermock-api-mockito
модуль.powermock-модуль-junit4
: Для запуска тестов JUnit 4 с использованием PowerMock.powermock-модуль-testng
: Для запуска тестовых случаев TestNG и поддержки PowerMock.
Ниже приведен окончательный pom.xml из вашего проекта.
4.0.0 com.journaldev.powermock PowerMock-Examples 0.0.1-SNAPSHOT 6.14.3 4.12 2.19.0 2.0.0-beta.5 10 org.testng testng ${testng.version} test junit junit ${junit4.version} test org.mockito mockito-core ${mockito-core.version} test org.powermock powermock-module-testng ${powermock.version} test org.powermock powermock-module-junit4 ${powermock.version} test org.powermock powermock-api-mockito2 ${powermock.version} test maven-compiler-plugin 3.7.0 ${java.version} ${java.version} org.apache.maven.plugins maven-surefire-plugin 2.22.0 org.apache.maven.surefire surefire-junit47 2.22.0 org.apache.maven.surefire surefire-testng 2.22.0 src/test/java/ 5
Обратите внимание, что я использую 2.0.0-бета.5
версию PowerMock. Эта версия поддерживает Java 10, однако она все еще находится в бета-версии, поэтому в сложных случаях могут возникнуть некоторые проблемы.
Когда я попытался использовать текущую стабильную версию 1.7.x
, я получил следующие ошибки.
java.lang.NoSuchMethodError: org.mockito.internal.handler.MockHandlerFactory.createMockHandler(Lorg/mockito/mock/MockCreationSettings;)Lorg/mockito/internal/InternalMockHandler; at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMethodInvocationControl(DefaultMockCreator.java:114) at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.createMock(DefaultMockCreator.java:69) at org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock(DefaultMockCreator.java:46) at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:73)
Вот проблемы GitHub, открытые для этого исключения – проблема 1 и проблема 2 .
Давайте создадим простой класс со статическим методом.
package com.journaldev.mockito.staticmethod; public class Utils { public static boolean print(String msg) { System.out.println("Printing "+msg); return true; } }
Пример JUnit Mockito PowerMock
Нам нужно сделать следующее, чтобы интегрировать PowerMock с Mockito и JUnit 4.
- Аннотировать тестовый класс с помощью
@RunWith(PowerMockRunner.class)
аннотация. - Аннотируйте тестовый класс с помощью
@PrepareForTest
и предоставьте класс для насмешек с помощью PowerMock. - Используйте
PowerMockito.mockStatic()
для насмешливого класса со статическими методами. - Используйте
PowerMockito.verifyStatic()
для проверки издевательских методов с использованием Mockito.
Вот полный пример насмешливого статического метода с использованием Mockito и PowerMock в тестовом примере JUnit.
package com.journaldev.mockito.staticmethod; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.when; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utils.class) public class JUnit4PowerMockitoStaticTest{ @Test public void test_static_mock_methods() { PowerMockito.mockStatic(Utils.class); when(Utils.print("Hello")).thenReturn(true); when(Utils.print("Wrong Message")).thenReturn(false); assertTrue(Utils.print("Hello")); assertFalse(Utils.print("Wrong Message")); PowerMockito.verifyStatic(Utils.class, atLeast(2)); Utils.print(anyString()); } }
Пример TestNG Mockito PowerMock
Для тестирования тестовых случаев нам не нужно использовать @RunWith
аннотацию. Нам нужны тестовые классы для расширения PowerMockTestCase
, чтобы PowerMockObjectFactory
использовался для создания экземпляра тестового класса.
package com.journaldev.mockito.staticmethod; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.mockito.Mockito.*; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.testng.PowerMockTestCase; import org.testng.annotations.Test; @PrepareForTest(Utils.class) public class TestNGPowerMockitoStaticTest extends PowerMockTestCase{ @Test public void test_static_mock_methods() { PowerMockito.mockStatic(Utils.class); when(Utils.print("Hello")).thenReturn(true); when(Utils.print("Wrong Message")).thenReturn(false); assertTrue(Utils.print("Hello")); assertFalse(Utils.print("Wrong Message")); PowerMockito.verifyStatic(Utils.class); Utils.print("Hello"); PowerMockito.verifyStatic(Utils.class, times(2)); Utils.print(anyString()); } }
Резюме
PowerMock предоставляет расширенные функции для Mockito, одной из которых является возможность тестирования статических методов. Он легко интегрируется с JUnit4 и TestNG. Однако для JUnit 5 не существует краткосрочного плана поддержки.