2012-01-19 4 views
5

Qui DB è solo un esempio. Significa che qualcosa non può essere preparato in un ambiente di test unitario.Come testare una rotta con un bean che accederà al DB?

consideri il percorso di seguito:

DBBean dbBean = new DBBean(); 
from("direct:test").bean(dbBean).to("direct:someOtherLogic"); 

Quando fare test di unità, c'è qualche metodo per prendere in giro la 'dbBean'? Nel test unitario, è difficile impostare un DB reale.

Grazie per il vostro aiuto.

risposta

3

Camel dispone di un kit di test che consente di manipolare il percorso prima di essere testato. Quindi è possibile mantenere intatto il percorso e quindi sostituire parti del percorso e quant'altro. È un po 'elaborato e documentato come la funzionalità di consulenza qui: http://camel.apache.org/advicewith.html

In genere, è più semplice se gli EIP hanno ID assegnati, in quanto è possibile quindi fare riferimento a questi ID e sostituirli con qualcos'altro.

Tuttavia, se si sa che si desidera sostituire il primo BeanDefinition si può fare:

weaveByType(BeanDefinition.class).selectFirst().replace().to("mock:dbBean"); 

Vedi i link di cui sopra come usare questo con il consiglio-con nel kit Cammello di prova (ad esempio, cammello-test) VASO.

Ricordare che si consiglia di indicare al kit di test Camel con cui si sta consultando il consiglio, che si fa come documentato nella parte inferiore del collegamento.

1

è possibile utilizzare un database embedded (DERBY, ecc) ... Ecco un esempio tratto da un camel-jdbc unit test

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> 
    <route> 
     <from uri="timer://kickoff?period=10000"/> 
     <setBody> 
      <constant>select * from customer</constant> 
     </setBody> 
     <to uri="jdbc:testdb"/> 
     <to uri="mock:result"/> 
    </route> 
</camelContext> 

    <!-- Just add a demo to show how to bind a date source for camel in Spring--> 
    <jdbc:embedded-database id="testdb" type="DERBY"> 
     <jdbc:script location="classpath:sql/init.sql"/> 
    </jdbc:embedded-database> 

In caso contrario, si potrebbe provare a utilizzare DBUnit (a prova di installazione del database) o Mockito (per simulare la risposta di una chiamata DB)

+1

Buona soluzione per il test dell'unità DB. Tuttavia, per alcuni altri bean, è forse difficile simulare l'ambiente. Penso che deridere il fagiolo sia un approccio migliore. – Javen

+0

sì, ho capito perfettamente ... Mockito è fantastico se riesci a farlo giocare bene con il tuo setup ... altrimenti, Claus ha suggerito altri approcci (advicewith, ecc.) Che avrebbero funzionato bene ... buona fortuna –

1

Se DbBean è un'interfaccia, è possibile avere 2 diverse implementazioni. Uno per il vero lavoro di DB. E altro per i test unitari derisi, dove si simula il DB.

Poi la sua solo una questione di istanziare un mock nel vostro unit test

DbBean db = new MockDbBean() 

Come il suo codice Java semplicemente. Si può avere un getter/setter nella classe RouteBuilder

public class MyRouteBuilder extends RouteBuilder { 
    private DbBean dbBean; 

    // getter/setter for dbBean 

    public void configure() throws Exception { 
     from("direct:test").bean(dbBean).to("direct:someOtherLogic"); 
    } 
} 

Poi da un'unità di testare la sua solo una questione di impostazione del MockDbBean usando un setter sul MyRouteBuilder esempio.

+0

Quindi Penso che la chiave sia esporre il fagiolo in rotta verso l'esterno. Quando esegui il test unitario, imposta il fagiolo finto sulla rotta testata. Ma esiste un modo per recuperare il bean direttamente dal contesto del cammello e sostituirlo con un bean finto? In questo modo, non ho bisogno di modificare il percorso corrente e non sono necessari più campi e getter/setter. – Javen