2015-09-23 40 views
18

Sto utilizzando PowerMock e vorrei sapere come mantenere tutto il comportamento della classe figlio, ma le chiamate di stub super che possono essere sostituite dal figlio.PowerMock: metodi di stub dalla classe genitore

Dire che ho questa classe:

public class A { 
    public String someMethod() { 
     return "I don't want to see this value"; 
    } 
} 

e una classe secondaria:

public class B extends A { 
    @Override 
    public String someMethod() { 
     return super.someMethod() + ", but I want to see this one"; 
    } 
} 

Come si stub la chiamata a super.someMethod()?

Ho provato

@Test 
public void test() { 
    B spy = PowerMockito.spy(new B()); 
    PowerMockito.doReturn("value").when((A)spy).someMethod(); 

    assertEquals("value, but I want to see this one", spi.someMethod()); 
} 
+0

Cosa sta succedendo nel caso di test corrente? – Keith

+0

Sta definendo il metodo della sottoclasse. – jchitel

+1

Sembra questo errore: https: //github.com/jayway/powermock/issues/487 – javaPlease42

risposta

1

Il cast si sta tentando non sta andando a lavorare come vi aspettate. Tuttavia, penso che tu abbia un paio di opzioni per aggirare questo, certamente con PowerMockito.

Dai un'occhiata a questo StackOverflow answer.

+1

Sì, stavo davvero cercando di trovare una soluzione a questo perché il punto di PowerMock è che non dovresti dover cambiare la struttura del tuo codice per renderlo testabile. Tuttavia, mi sono reso conto che dovevo bilanciarlo con la quantità di tempo e sforzo necessari per scrivere i test, quindi ho modificato il codice per renderlo più facile da testare. Ma grazie per la risorsa! – jchitel

1

Potete provare sopprimere i metodi della classe genitore,

PowerMockito.suppress(methodsDeclaredIn(A.class)); 

Ecco un articolo su Stubbing, soppressione e sostituzione con PowerMock che potrebbe essere di qualche utilità.

https://www.jayway.com/2013/03/05/beyond-mocking-with-powermock/

+0

Il metodo 'sopprimi' non è utile perché ho bisogno di restituire un valore simulato. Grazie comunque. – javaPlease42

+0

Che ne dici di usare PowerMockito.replace() per sostituire il metodo dei genitori con uno che restituisce il tuo valore deriso? – Steve

2

Non dimenticate di aggiungere @PrepareForTest({ParentClassToSupress.class}) sulla vostra classe di test. Quindi puoi fare come suggerisce Steve e sopprimere i metodi nel genitore: PowerMockito.suppress(methodsDeclaredIn(ParentClassToSupress.class));