У меня очень простой класс, который имеет частный метод. Вопрос в том, как подавить этот вызов метода?
Вот мой код:
public class Example {
private int value;
public Example(int value) {
this.value = value;
method();
}
private void method() {
throw new RuntimeException();
}
public int getValue() {
return value;
}
}
И код теста (попытка как минимум):
public void test() throws Exception {
PowerMockito.doNothing().when(Example.class, "method");
final int EXPECTED_VALUE = 1;
Example example = new Example(EXPECTED_VALUE);
int RETRIEVED_VALUE = example.getValue();
assertEquals(RETRIEVED_VALUE, EXPECTED_VALUE);
verifyPrivate(Example.class, times(1)).invoke("method");
}
UPD
Для меня важно соблюдать эти два условия:
PowerMockito.doNothing().when(Example.class, "method");
PowerMockito.verifyPrivate(Example.class, times(1)).invoke("method");
Поскольку вы не можете изменить тестируемый код. Я думаю, что нет идеального решения. Вам нужно частично издеваться над экземпляром Example
.
List list = new LinkedList();
List spy = spy(list);
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
но вы не можете этого сделать, поскольку сначала вам необходимо создать экземпляр объекта.
Поэтому я предлагаю следующее обходное решение, состоящее из двух тестов. Первый тест удаляет частный method
из класса, создает экземпляр Example
и проверяет правильность инициализации Example
. Второй тест создает экземпляр Example
и проверяет, что RuntimeException
(побочный эффект частного method
).
import static org.junit.Assert.assertEquals;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
import static org.powermock.api.support.membermodification.MemberModifier.suppress;
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(Example.class)
public class ExampleTest {
@Test
public void constructor_should_initialize_the_v2alue() throws Exception {
suppress(method(Example.class, "method"));
final int EXPECTED_VALUE = 1;
Example example = PowerMockito.spy(new Example(EXPECTED_VALUE));
int RETRIEVED_VALUE = example.getValue();
assertEquals(RETRIEVED_VALUE, EXPECTED_VALUE);
}
@Test(expected=RuntimeException.class)
public void constructor_should_invoke_the_private_method() throws Exception {
new Example(1);
}
}