2013-04-18 7 views
6

Non riesco a capire come prendere in giro un semplice metodo setter usando Mockito. Ho la seguente classe:Come sovrascrivere un settermethod in Mockito?

class MyClass { 
    private SomeObject someObject; 

    public void setSomeObject(SomeObject someObject) { 
     this.someObject = someObject; 
    } 

    public someObject getSomeObject() { 
     return someObject; 
    } 
} 

Ora voglio solo che quando "setSomeObject" si chiama che una nuova istanza di "SomeObject" è impostato. Anche il parametro all'interno del setter dovrebbe essere ignorato.

ho bisogno di qualcosa di simile:

MyClass mockedClass = mock(MyClass.class); 
when(mockedClass.setSomeObject([ignoreWhatsInHere])) 
    .then(mockedClass.setSomeObject(new SomeObject(); 

Tuttavia, io non riesco a ottenere la sintassi a lavorare per questo. Posso solo far funzionare i mock usando getter(), perché poi posso restituire qualcosa. Ma non riesco a capire come fare lo stesso per setters().

Tutti apprezzati.

+0

Perché ne hai bisogno? Cosa vuoi esattamente raggiungere? – axtavt

+0

hmm questo non funziona, come si dice che un ritorno non è applicabile per il vuoto:/ – Lonelyisland

+0

beh il fatto è che setSomeObject() sarà chiamato in qualche modo come questo: myClass.setSomeObject (someWeirdFunction.whichreturnsfinallySomeObject()). Quindi in realtà vorrei solo sapere se esiste una chiamata al setter e quindi impostare l'oggetto da solo. – Lonelyisland

risposta

5

Dovresti essere in grado di utilizzare la famiglia di metodi doThrow()|doAnswer()|doNothing()|doReturn() per eseguire un'azione appropriata durante il test dei metodi che restituiscono i void compresi i setter. Così, invece di

when(mockedObject.someMethod()).thenReturn(something) 

si usa doAnswer() per restituire un oggetto risposta personalizzato, anche se non è terribilmente eleganti, e si potrebbe essere meglio utilizzare uno stub:

doAnswer(new Answer() { 
    public Object answer(InvocationOnMock invocation) { 
      //whatever code you want to run when the method is called 
      return null; 
    }}).when(mockedObject).someMethod(); 
} 

Se si sta tentando di tornare valori diversi dalla stessa chiamata getter, potresti anche voler guardare le chiamate consecutive di stubing di mockito, che ti permetteranno, ad esempio, di lanciare un errore per la prima chiamata di un metodo, e quindi di restituire un oggetto dalla seconda chiamata.

vedere http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#12 per ulteriori dettagli su entrambi.