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

Макет частного метода EasyMock с использованием PowerMock

Иногда мы хотим протестировать метод, использующий частный метод. Мы можем создать макет объекта с помощью EasyMock, но EasyMock не позволяет нам издеваться

Автор оригинала: Pankaj Kumar.

Иногда мы хотим протестировать метод, использующий частный метод. Мы можем создать макет объекта с помощью EasyMock, но EasyMock не позволяет нам имитировать частные методы. Таким образом, мы можем использовать расширение API PowerMock EasyMock для моделирования частных методов класса.

Макет частного метода EasyMock с использованием PowerMock

Для подавления поведения частного метода мы должны использовать PowerMock.createPartialMock () , чтобы получить макет объекта. Это необходимо для того, чтобы мы не издевались над методами, в которых вызываются эти частные методы.

После этого используйте PowerMock.expectPrivate() метод, чтобы заглушить поведение частного метода.

Обязательно вызовите PowerMock.replay() перед написанием тестового кода, в котором используются методы с заглушкой. Для проверки вызова методов-заглушек используйте метод PowerMock.verify () .

Частный метод EasyMock – JUnit 4

На данный момент PowerMock не поддерживает JUnit 5, поэтому я буду использовать JUnit 4 для написания тестовых примеров.

Допустим, у нас есть класс, определенный как:

class Foo {
	private boolean isInit() {
		return false;
	}
	private String reverse(String s) {
		return null;
	}
	public boolean checkStatus() {
		return isInit();
	}
	public String doReverse(String s) {
		return reverse(s);
	}
}

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

Вот тестовый класс, в котором мы высмеиваем поведение частного метода.

package com.journaldev.easymock.powermock.privatemethod;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.powermock.api.easymock.PowerMock.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class)
public class JUnit4PowerMockEasyMockPrivateExample {

	@Test
	public void test_private_method() throws Exception {
		Foo mock = createPartialMock(Foo.class, "isInit", "reverse");
		
		expectPrivate(mock, "isInit").andReturn(true);
		expectPrivate(mock, "reverse", "cat").andReturn("tac");
		expectPrivate(mock, "reverse", "123").andReturn("321");
		replay(mock);
		
		assertTrue(mock.checkStatus());
		assertEquals("tac", mock.doReverse("cat"));
		assertEquals("321", mock.doReverse("123"));
		
		verify(mock);
	}
}

Обратите внимание, что мы создаем частичный макет только для частных методов, публичные методы не высмеиваются. Поэтому, когда мы вызываем эти общедоступные методы, будет вызван реальный метод, который внутренне вызовет закрытый метод, и будет использована наша реализация метода с заглушкой.

Частный метод EasyMock – Тестирование

Вот пример издевательского частного метода, написанного в рамках тестирования TestNG.

package com.journaldev.easymock.powermock.privatemethod;

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.Test;

import static org.powermock.api.easymock.PowerMock.*;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;

@PrepareForTest(Foo.class)
public class TestNGPowerMockEasyMockPrivateExample extends PowerMockTestCase{

	@Test
	public void test_private_method() throws Exception {
		Foo mock = createPartialMock(Foo.class, "isInit", "reverse");
		
		expectPrivate(mock, "isInit").andReturn(true);
		expectPrivate(mock, "reverse", "cat").andReturn("tac");
		expectPrivate(mock, "reverse", "123").andReturn("321");
		replay(mock);
		
		assertTrue(mock.checkStatus());
		assertEquals("tac", mock.doReverse("cat"));
		assertEquals("321", mock.doReverse("123"));
		
		verify(mock);
	}
}

Обратите внимание, что класс TestNG расширяет класс PowerMockTestCase , поэтому для запуска тестовых случаев используется API PowerMock.

Резюме

PowerMock – это отличный API-интерфейс расширения для фреймворков EasyMock и Mockito. Он легко интегрируется с фреймворками EasyMock и JUnit/TestNG. Я надеюсь, что они начнут поддерживать JUnit 5 очень скоро.