Как использовать Mockito или PowerMock для подделки защищенного метода, который реализуется подклассом, но унаследован от абстрактного суперкласса?Как обмануть защищенный метод подкласса, унаследованный от абстрактного класса?
Другими словами, я хочу протестировать метод «doSomething», высмеивая «doSomethingElse».
Аннотация супер класс
public abstract class TypeA {
public void doSomething() {
// Calls for subclass behavior
doSomethingElse();
}
protected abstract String doSomethingElse();
}
реализации Подкласс
public class TypeB extends TypeA {
@Override
protected String doSomethingElse() {
return "this method needs to be mocked";
}
}
Решение
Ответы, приведенные здесь, являются правильными d будет работать, если участвующие классы находятся в одном пакете.
Но если разные пакеты задействованы один вариант для пользователя PowerMock. Следующий пример работал на меня. Конечно, могут быть другие способы сделать это, это тот, который работает.
import static org.junit.Assert.assertEquals;
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({ TypeB.class })
public class TestAbstract {
@Test
public void test_UsingPowerMock() throws Exception {
// Spy a subclass using PowerMock
TypeB b = PowerMockito.spy(new TypeB());
String expected = "some value for mock";
// Mock a method by its name using PowerMock again
PowerMockito.doReturn(expected).when(b, "doSomethingElse");
// Calls the
String actual = b.doSomething();
assertEquals(expected, actual);
}
}
Примечание: Испытания, проведенные с использованием Java 5, JUnit 4.11 Mockito 1.9.0 и PowerMock 1.4.12.
Этот подход дает мне «NullPointerException» с Java 8, JUnit 4.12 и PowerMock 1.6.4. – Mack