2013-05-27 11 views
13

Mi piacerebbe prendere in giro un po 'interfaccia fluida con finto, che è fondamentalmente un costruttore mail:Come posso prendere in giro in modo efficiente un'interfaccia fluida con Spock Mock?

this.builder() 
      .from(from) 
      .to(to) 
      .cc(cc) 
      .bcc(bcc) 
      .template(templateId, templateParameter) 
      .send(); 

Quando beffardo questo con Spock, questo ha bisogno di un sacco di configurazione come questa:

def builder = Mock(Builder) 
builder.from(_) >> builder 
builder.to(_) >> builder 

ecc. Diventa ancora più complicato quando si vogliono testare determinate interazioni con la simulazione, a seconda del caso d'uso. Così ho praticamente avuto due domande qui:

  1. c'è un modo per unire le regole finta, in modo da poter fare un generale una configurazione iniziale dell'interfaccia fluente in un metodo che posso riutilizzare su ogni banco di prova e poi specificare regole aggiuntive per test-case?
  2. C'è un modo per specificare il mocking di un'interfaccia fluente con meno codice, ad es. qualcosa di simile:

    costruttore def = Mock (Builder) builder./(from|to|cc|bcc|template)/(*) >> builder

    o qualcosa di equivalente a di Mockito profonda Stub (vedi http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS)

risposta

11

si può fare qualcosa di simile:

def "stubbing and mocking a builder"() { 
    def builder = Mock(Builder) 
    // could also put this into a setup method 
    builder./from|to|cc|bcc|template|send/(*_) >> builder 

    when: 
    // exercise code that uses builder 

    then: 
    // interactions in then-block override any other interactions 
    // note that you have to repeat the stubbing 
    1 * builder.to("fred") >> builder 
} 
+0

Grande questo sta lavorando :) Grazie! Qualche piano per migliorare questo in modo da non dover ripetere lo stub nell'allora-parte? –

+1

Non abbiamo piani per questo. Il fatto che lo stub e il deridere di un'interazione avvengano insieme è inerente al modo in cui funziona il sistema di derisione di Spock. È lo stesso approccio usato da JMock, EasyMock, ecc. Solo Mockito usa un approccio diverso, che ha altri svantaggi. –

+0

Vedo, grazie per aver chiarito questo :) –

Problemi correlati