如何模拟从抽象类inheritance的受保护子类方法?

如何使用Mockito或PowerMock来模拟由子类实现但从抽象超类inheritance的受保护方法?

换句话说,我想在模拟“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"; } } 

这里给出的答案是正确的,如果涉及的类在同一个包中,它们将起作用。

但如果涉及不同的包,则可以选择使用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进行测试。

Mockito.CALLS_REAL_METHODS抽象方法时,可以使用Mockito.CALLS_REAL_METHODS 。 这将调用类的原始方法,您可以自己模拟所有抽象方法。

 TypeA typeA = mock(TypeA.class, Mockito.CALLS_REAL_METHODS); when(typeA.doSomethingElse()).thenReturn("Hello"); typeA.doSomething(); 

或者您使用间谍直接在TypeB上进行测试:

 TypeB typeB = spy(new TypeB()); when(typeB.doSomethingElse()).thenReturn("Hello"); typeB.doSomething(); 

我建议使用Mockito:

 // Create a new Mock final TypeA a = Mockito.mock(TypeA.class, Mockito.CALLS_REAL_METHODS); // Call the method a.doSomething(); // Now verify that our mocked class' method was called Mockito.verify(a, Mockito.times(1)).doSomethingElse(); 

您可以使用mockito以下列方式测试您的abtract类

 TypeA typA = Mockito.mock(TypeA.class, Mockito.CALLS_REAL_METHODS); when(typA.doSomethingElse()).thenReturn("doSomethingElse"); Assert.assertSomething(typeA.doSomething()); 

要模拟在抽象类中返回void的方法,我们可以使用:

 MyAbstractClass abs = Mockito.mock(MyAbstractClass.class); Mockito.doNothing().when(abs).myMethod(arg1,arg2....)); 

我们可以根据要求用Mockito.anyString()等替换参数。