2015-12-16 13 views
10

Si consideri il seguente metodo:Come chiamare il metodo call e restituire il valore senza eseguire il metodo?

public boolean isACertainValue() { 
     if(context.getValueA() != null && context.getValueA().toBoolean() == true) { 
     if(context.getType() != null && context.getType() == ContextType.certainType) { 
      return true; 
     } 
    } 
    return false; 
} 

non ho scritto questo codice, è brutto come l'inferno, è totalmente troppo complicata, ma devo lavorare con esso.

Ora voglio testare un metodo che si basa su una chiamata a questo metodo.

ho pensato che avrei potuto fare con questo:

Mockito.when(spy.isACertainValue()).thenReturn(true); perché questo è il caso che voglio provare.

Ma non funziona in quanto è ancora chiamando il metodo-corpo:/

ricevo nullpointers o meglio ho qualcosa sulla falsariga di

misusing.WrongTypeOfReturnValue; Boolean non può essere restituito da getValueA(). getValueA() dovrebbe restituire ValueA

così ho provato (come una soluzione) per fare:

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA()); e Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

ma tanto sono un nullpointer che I cant sembrano essere in grado eseguire il debug.

Quindi, come va fatto in questo caso?

+1

questo è esattamente come farlo, ma forse c'è un valore in che valoreA è necessario più avanti nel test, così si dovrebbe anche prendere in giro l'oggetto restituito, non solo il ritorno un'istanza creata con un costruttore (predefinito). – Stultuske

risposta

13

Quando si invoca

Mockito.when(spy.isCertainValue()).thenReturn(true); 

il metodo isCertainValue() è sempre chiamato qui. Ecco come funziona Java: per valutare l'argomento di Mockito.when, il risultato di spy.isCertainValue() deve essere valutato in modo che il metodo debba essere chiamato.

Se non si desidera che ciò accada, è possibile utilizzare the following construct:

Mockito.doReturn(true).when(spy).isCertainValue(); 

questo avrà lo stesso effetto beffardo ma il metodo non sarà chiamato con questo.

+0

Grazie, ora sono più in pista ... Prendo un punto nullo xD Odio questo programma così tanto, è un abominio: X – Sorona

+0

Link non funzionante. Dove installate la spia? – powder366

+0

Ha funzionato per me. Ha smesso di lanciare NPE. Grazie Tunaki! – Dish

0

Questo codice è corretto:

Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType); 

Ma hai trovato NullPointerException perché non è stato definito il valore di derisione che dovrebbe essere definisce, beh sto usando primavera, nel mio file di contesto quando mi definisco @Autowired fagioli definisco in questo modo:

<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.myspringproject.bean.ContextMock" /> 
</bean>