2017-09-20 6 views
0

Je souhaite obtenir des échanges d'un objet mockEndPoint dans une classe de test unitaire pour Camel Route, mais cela ne fonctionne pas.getExchange de mockEndPoint dans une classe de test d'unité pour Route de chameau ne se comporte pas comme prévu

Voici ma classe de test unitaire:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:camel-unit-test.xml") 
public class ImportDatabaseRouteTest extends CamelTestSupport { 
    @Value("${sql.importDatabase}") 
    String oldEndPoint; 

    @Autowired 
    private ImportDatabaseRoute importDatabaseRoute; 

    @Autowired 
    private DriverManagerDataSource dataSource; 

    @Override 
    protected RouteBuilder createRouteBuilder() throws Exception { 
     return importDatabaseRoute; 
    } 

    @Before 
    public void mockEndpoints() throws Exception { 
     AdviceWithRouteBuilder adviceTest = new AdviceWithRouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       interceptSendToEndpoint(oldEndPoint) 
         .skipSendToOriginalEndpoint() 
         .to("mock:catchCSVList"); 
      } 
     }; 
     context.getRouteDefinitions().get(0).adviceWith(context, adviceTest); 
    } 

    @Override 
    public boolean isUseAdviceWith() { 
     return true; 
    } 

    @Override 
    protected JndiRegistry createRegistry() throws Exception { 
     JndiRegistry jndi = super.createRegistry(); 
     //use jndi.bind to bind your beans 
     jndi.bind("dataSource", dataSource); 
     return jndi; 
    } 
    @Test 
    public void testTheImportRoute() throws Exception { 
     MockEndpoint mockEndPointTest = getMockEndpoint("mock:catchCSVList"); 
     context.start(); 
     List<List<String>> test = (List<List<String>>) mockEndPointTest.getExchanges().get(0).getIn().getBody(); 
     assertEquals("4227",test.get(1).get(0)); 
     assertEquals("370",test.get(1).get(1)); 
     assertEquals("",test.get(1).get(2)); 
     mockEndPointTest.expectedMessageCount(1); 
     mockEndPointTest.assertIsSatisfied(); 
     context.stop(); 
    } 

} 

Et voici les résultats: java.lang.ArrayIndexOutOfBoundsException: 0

at java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:387) 

S'il vous plaît aidez-moi à corriger. Merci beaucoup.

Répondre

0

Vous devez affirmer le faux avant d'obtenir les échanges. Comme ces échanges sont le réel échange qui est arrivé à la maquette. Donc, ses attentes doivent être satisfaites en premier, ce qui dit qu'un message devrait arriver. Et si cela est le succès, alors vous pouvez obtenir cet échange via l'index 0, et vous ne serez pas un IndexOutOfBoundsException

MockEndpoint mockEndPointTest = getMockEndpoint("mock:catchCSVList"); 
    context.start(); 

    // set expectations on mock here 
    mockEndPointTest.expectedMessageCount(1); 
    mockEndPointTest.assertIsSatisfied(); 

    // okay now we can get the exchange's from the mock 
    List<List<String>> test = (List<List<String>>) mockEndPointTest.getExchanges().get(0).getIn().getBody(); 
    assertEquals("4227",test.get(1).get(0)); 
    assertEquals("370",test.get(1).get(1)); 
    assertEquals("",test.get(1).get(2)); 

    context.stop(); 
+0

wow, vous êtes le meilleur. Je suis en train de lire votre livre dès maintenant pour apprendre Apache Camel. Merci beaucoup. –