如何使用Mockito或PowerMock來模擬一個由子類實現但從一個抽象超類繼承的受保護方法?如何模仿繼承自抽象類的受保護的子類方法?
換句話說,我想在嘲笑「doSomethingElse」時測試「doSomething」方法。
摘要超類
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,1.9.0的Mockito和PowerMock 1.4.12完成。
這種方法給了我一個帶有Java 8,JUnit 4.12和PowerMock 1.6.4的'NullPointerException'。 – Mack