BonanzaOne BonanzaOne - 9 months ago 90
Java Question

How to mock protected subclass method inherited from abstract class?

How to use Mockito or PowerMock to mock a protected method that is realized by a subclass, but inherited from an abstract super class?

In other words, I want to test "doSomething" method while mocking the "doSomethingElse".

Abstract super class

public abstract class TypeA {

public void doSomething() {

// Calls for subclass behavior

protected abstract String doSomethingElse();


Subclass implementation

public class TypeB extends TypeA {

protected String doSomethingElse() {
return "this method needs to be mocked";



Answers given here are correct and will work if classes involved are in the same package.

But if different packages are involved one option is to user PowerMock. The following example worked for me. Of course there might be other ways of doing it, this is one that works.

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;

@PrepareForTest({ TypeB.class })
public class TestAbstract {

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);


Note: Tests done using Java 5, jUnit 4.11, Mockito 1.9.0 and PowerMock 1.4.12.

Answer Source

You can use Mockito.CALLS_REAL_METHODS when mocking the abstract method. This will call the originals methods of the class and you can mock all abstract methods by yourself.

TypeA typeA = mock(TypeA.class, Mockito.CALLS_REAL_METHODS);

Or you test directly on the TypeB with a spy:

TypeB typeB = spy(new TypeB());