2012-04-18 2 views
20

Sono una specie di novità per Mockito e mi chiedevo come potevo bloccare una coppia get/set.Mockito: come bloccare il setter getter

Per esempio

public interface Dummy { 
    public String getString(); 
    public void setString(String string); 
} 

Come posso farli comportarsi correttamente: se da qualche parte in un test invoco setString("something"); vorrei getString() tornare "qualcosa". È fattibile o esiste un modo migliore per gestire questi casi?

+1

C'è una ragione si vuole prendere in giro 'Dummy' e non si può semplicemente utilizzare un oggetto normale attuarlo? – darrengorman

+1

Cosa ha detto @milkplusvellocet. Inoltre, se vuoi veramente/aver bisogno di testare un setter, stai facendo test e/o setter in modo sbagliato. –

+0

@milkplusvellocet in realtà sto eseguendo lo stub di HttpServletRequest e voglio che la proprietà characterSetEncoding funzioni. Ci sono troppi metodi per implementare l'uso di un oggetto normale. Questo mi fa pensare, possiamo prendere in giro lezioni astratte? Se è così, allora sarebbe una soluzione per me. Cercherò domani, non ho il mio spazio di lavoro con me. –

risposta

28

Desideravo anche che il getter restituisse il risultato della chiamata setter recente.

Avere

class Dog 
{ 
    private Sound sound; 

    public Sound getSound() { 
     return sound; 
    } 
    public void setSound(Sound sound) { 
     this.sound = sound; 
    } 
} 

class Sound 
{ 
    private String syllable; 

    Sound(String syllable) { 
     this.syllable = syllable; 
    } 
} 

ho usato il seguente per collegare il setter per il getter:

final Dog mockedDog = Mockito.mock(Dog.class, Mockito.RETURNS_DEEP_STUBS); 
// connect getter and setter 
Mockito.when(mockedDog.getSound()).thenCallRealMethod(); 
Mockito.doCallRealMethod().when(mockedDog).setSound(Mockito.any(Sound.class)); 
0

In questo caso particolare per HttpServletRequest stubbing vi raccomando vivamente di utilizzare framework Spring-Mock: (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/mock/web/package-summary.html)

Ha mock built-in per le operazioni di web based.

utilizzare altrimenti la risposta per definire la propria risposta per gli oggetti deriso (http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/stubbing/Answer.html)

6

Posso pensare a tre possibili approcci.

  1. Non utilizzare HttpServletRequest direttamente nell'applicazione; crea una classe wrapper per esso e ha un'interfaccia per la classe wrapper. Ovunque tu usi attualmente HttpServletRequest nell'applicazione, usa invece l'interfaccia. Quindi nel test, avere un'implementazione alternativa di questa interfaccia. Quindi, non hai affatto bisogno di un finto Mockito.

  2. Avere un campo nella classe di test che memorizza il valore impostato a String. Crea due oggetti Mockito Answer; uno che restituisce il valore di questo campo quando viene chiamato getString e un altro che imposta il valore di questo campo quando viene chiamato setString. Fai una finta nel solito modo e blocca per usare entrambe le risposte.

  3. Creare una classe astratta (che può essere una classe interna statica della classe di test) che implementa l'interfaccia HttpServletRequest, ma ha il campo che si desidera impostare e definisce il getter e il setter. Quindi prendi in giro la classe astratta e passa Mockito.CALLS_REAL_METHODS come risposta predefinita. Quando chiami il getter o il setter sul finto, il vero metodo prenderà il via, che è il comportamento che vuoi.

Speriamo che una di queste tre alternative soddisfi le vostre esigenze.

+1

HttpSevletRequest è un'interfaccia in realtà, l'unica cosa è che ha troppi metodi da implementare per voler farlo. Per la seconda opzione, questo è forse l'approccio migliore. Avrei preferito usare una classe astratta che definisce solo questi due metodi. Pubblicherò la soluzione che ho scelto. –

+0

Whoops, mi dispiace, ho dimenticato che era un'interfaccia. Non sono più sicuro dell'opzione 1; Avrei bisogno di sapere di più sul tuo codice per sapere se posso farlo funzionare. Vuoi provare l'opzione 2? Sono felice di aiutarti se ne hai bisogno. –

+0

In realtà, penso che l'utilizzo di una classe astratta possa funzionare in Mockito. Tutto quello che dovrei fare è indicare che voglio invocare i "metodi reali" per il getter and setter. Ho trovato questo collegamento che potrebbe essere interessante: http://marcschwieterman.com/blog/simple-stub-creation-with-mockito-partial-mocks/ –