2010-10-19 5 views
14

C'è un messaggio (testo), quale formato e contenuto sono sicuramente a conoscenza.
Per ora, la classe in Java, che analizza e legge questo messaggio dal file, è implementata.Mock o simula Message Queue (JMS)

Nel mondo reale, questo messaggio verrà dalla coda messaggi.

Per ora dovrei simulare, simulare o generare Coda messaggi sul mio PC locale a scopo di test.

Java spec (java jms):

JMS provider: A messaging system that implements the JMS specification. 
JMS clients: Java applications that send and receive messages. 
Messages: Objects that are used to communicate information between JMS clients. 

Per quanto riguarda questa specifica, ho bisogno JMS fornitore.

Client JMS -è la mia classe che legge il messaggio.
Messaggio lo so.

Quindi la domanda è come avviare la coda dei messaggi?
Come posso simularlo programmaticamente dal codice Java? Posso deriderlo in qualche modo?

Grazie.

+1

Perché andare a tutti quei guai? Perché non installare semplicemente un provider JMS locale sulla workstation e utilizzarlo? È possibile scaricare quelli open source e le versioni di prova dei fornitori JMS del fornitore. Dal momento che è JMS, qualsiasi implementazione conforme funzionerà per il test delle unità. –

+0

Questo è quanto chiedo, quindi ho bisogno di installare il provider JMS. Cosa potresti consigliarmi? grazie – sergionni

+0

Bene, io sono un IBMer quindi devo suggerire la versione di prova di WMQ. :-) Ma vedo che hai già trovato ActiveMQ che puoi usare per lo sviluppo senza scadere. D'altra parte, qualsiasi cosa tu usi nella produzione sarebbe meglio svilupparla, quindi passa a quello una volta che sai cosa sarà. –

risposta

5

Se si utilizza Spring Integration, è possibile farlo abbastanza facilmente. Ha un'implementazione "Canale" molto semplice e astratta. Puoi creare e testare i tuoi produttori e consumatori e quando sei pronto a fare un ulteriore passo avanti, devi solo specificare un adattatore JMS sulla parte superiore del tuo canale.

1

Generalmente è una cattiva pratica simulare o simulare un sistema esterno, come JMS. Un'idea migliore sarebbe quella di astrarre la logica in un bean standalone, implementare un livello di delega che collegherebbe JMS al bean. Con tale progettazione è possibile testare i bean in isolamento da JMS e quindi eseguire un test di sistema che testerebbe l'intera integrazione con il sistema JMS reale.

Per quanto riguarda il JMS in corso, è possibile consultare SomnifugiJMS.

+28

Non sono affatto d'accordo. La simulazione di un sistema esterno è fondamentale per i test delle unità, soprattutto se si fa affidamento su un'interfaccia esterna e non si desidera trasformare i test dell'unità in test di integrazione. –

+0

@ank - È * una * cattiva pratica per deridere un sistema esterno. La soluzione è creare un'interfaccia per quel sistema all'interno della propria applicazione (il bean a cui Eugene Kuleshov si riferisce) che gestisce la comunicazione con il sistema esterno, e poi in prova, si prende in giro * that *. Cercare di deridere l'intero sistema esterno è costoso e disordinato. – Ickster

+2

@Ickster è la definizione di un mock ... (So che questo è piuttosto vecchio, ma) puoi fornire un esempio della distinzione che credi di fare? – davemyron

-1

Generalmente sono d'accordo con Eugene Kuleshov. Ma se hai ancora bisogno di questo tipo di derisione ti suggerirei di usare BlckingQueue dal pacchetto java.util.concurent. Penso che non sia un grosso problema avvolgerlo con l'interfaccia javax.jms.Queue. BTW è una buona idea per qualche tipo di progetto open-source.

+0

Ho appena trovato Apache ActiveMQ. Cercando questo per primo. – sergionni

1

Per provare un'applicazione in isolamento quando il provider JMS produzione reale non è disponibile, è possibile utilizzare uno dei seguenti:

  1. JMS finte: Durante il test delle applicazioni è possibile simulare le dipendenze non-esistenti utilizzando test doubles. È possibile utilizzare un simulatore JMS che simulerà il comportamento di un vero provider JMS. API simulation tools ti consentirà di creare mock JMS (basta scegliere uno strumento che supporti JMS, ad esempio Traffic Parrot). L'utilizzo di una simulazione JMS ti consentirà un elevato livello di flessibilità durante i test. Sarai in grado di testare tipici scenari di test simili alla produzione ma anche situazioni ipotetiche impostando il tuo mock per restituire quasi ogni tipo di messaggio. Sarai anche in grado di simulare diversi tipi di errori, il che è spesso difficile con i veri provider JMS. Date un'occhiata a this introduction video to JMS service virtualization for ActiveMq (la virtualizzazione del servizio è un nome diverso per una simulazione) o this one for IBM MQ. Nota, questi video provengono da Traffic Parrot, ma il principio descritto qui si applica a qualsiasi strumento tu scelga.

  2. Istanza di test provider JMS: È possibile eseguire un provider JMS sul laptop o in uno degli ambienti di prova e collegare l'applicazione ad esso anziché al fornitore di produzione. Quando si utilizzano provider open source in produzione come ActiveMQ o RabbitMQ, dovrebbe essere facile eseguirne uno anche sul portatile perché sono leggeri e gratuiti. Per IBM Websphere MQ, è possibile utilizzare lo IBM MQ for Developers gratuito.

  3. Classe JMS simulato: È possibile utilizzare Mockito in test di unità per simulare interazioni con le classi JMS. Questa soluzione viene fornita con tutti i compromessi dei test unitari. Per ulteriori informazioni su quelli vedi testing pyramid. Se desideri testare la tua black box, usa una delle soluzioni che ho descritto sopra.