Рубрики
Без рубрики

Имитационный статический метод Mockito – PowerMock

Mockito Имитационный статический метод, учебник по PowerMock Mockito, PowerMock JUnit, тестирование PowerMock Mockito, макет PowerMockito, проверка, PowerMockRunner

Автор оригинала: 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 не существует краткосрочного плана поддержки.