Come utilizzare Mockito o PowerMock per simulare un metodo protetto realizzato da una sottoclasse, ma ereditato da una super classe astratta?Come simulare il metodo protetto di sottoclasse ereditato dalla classe astratta?
In altre parole, voglio testare il metodo "doSomething" mentre sto prendendo in giro "doSomethingElse".
astratta super-classe
public abstract class TypeA {
public void doSomething() {
// Calls for subclass behavior
doSomethingElse();
}
protected abstract String doSomethingElse();
}
implementazione di sottoclasse
public class TypeB extends TypeA {
@Override
protected String doSomethingElse() {
return "this method needs to be mocked";
}
}
Solution
risposte qui riportati sono corretti un d funzionerà se le classi coinvolte sono nello stesso pacchetto.
Ma se pacchetti diversi sono coinvolti, un'opzione è per l'utente PowerMock. Il seguente esempio ha funzionato per me. Naturalmente ci potrebbero essere altri modi per farlo, questo è quello che funziona.
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);
}
}
Nota: Prove eseguite usando Java 5, JUnit 4.11, Mockito 1.9.0 e 1.4.12 PowerMock.
Questo approccio mi dà un 'NullPointerException' con Java 8, JUnit 4.12 e PowerMock 1.6.4. – Mack