prerequisiti: sto utilizzando l'ultima versione di Play! framework e la versione di Java (non Scala).Verifica interazioni con servizi esterni
Ho bisogno di pubblicare un messaggio in una coda di messaggi quando viene creato un utente, e mi piacerebbe testarlo. Il mio problema è rendere questo facilmente testabile.
Il controller approccio
in altri ambiti, quello che avrei fatto sarebbe quella di utilizzare l'iniezione del costruttore nel controller e passare in una coda beffato nelle mie prove; tuttavia, con Play! i controller sono statici, il che significa che non posso eseguire new MyController(mockedQueue)
nei miei test.
Potrei usare Google Guice e inserire un'annotazione @Inject
su un campo statico nel mio controller, ma non mi sembra molto carino, poiché significa che devo rendere pubblico il campo da sostituire nel test , o devo usare un contenitore nei miei test. Preferisco di gran lunga usare l'iniezione del costruttore, ma gioca! non sembra facilitare questo.
L'approccio modello
Si dice spesso la logica dovrebbe essere nel modello, non è il controller. Ciò ha senso; tuttavia, non siamo qui in Ruby e il fatto che le tue entità interagiscano con servizi esterni (e-mail, code di messaggi ecc.) è considerevolmente meno verificabile rispetto a un ambiente dinamico in cui potresti semplicemente sostituire le tue chiamate statiche MessageQueue
con un'istanza simulata in volere.
Se faccio in modo che la mia entità effettui la chiamata in coda, come è verificabile?
Ovviamente, entrambe queste situazioni non sono necessarie se eseguo test di integrazione end-to-end, ma preferisco non aver bisogno di una coda di messaggi o di un server SMTP attivato per l'esecuzione dei test.
Quindi la mia domanda è: Come modellino il mio Play! controller e/o modelli per facilitare le interazioni di test con i servizi esterni?
Un problema * potenziale * con l'approccio 'ServiceFactory' è quando il campo sarà inizializzato; poiché è un campo statico, 'getInstance' può essere chiamato dall'inizializzatore prima che tu abbia la possibilità di sostituire l'istanza. Sto solo pensando ad alta voce, non in realtà ho verificato questo. –
In realtà, nell'esempio ServiceFactory è Singleton. Non si sostituirà ServiceFactory stesso, ma il QueueService lo 'produce'. –
Sì, lo capisco; tuttavia, poiché il campo è statico, esiste la possibilità che venga inizializzato prima di poter sostituire qualsiasi valore restituito da 'getInstance'. In genere non si ha il controllo su quando viene eseguito l'inizializzatore statico, quindi potrebbe succedere prima che si verifichi l'installazione del test. –