2011-04-14 5 views
17

내 Route를 별도의 RouteBuilder 클래스에서 생성했다고 가정 해 보겠습니다. 검증에 따라하는 것은 특정 JMS 큐를 기대 결과 및 DB에 Apache Camel에서 테스트 생산 경로를 단원하는 방법은 무엇입니까?

내가 좋겠 뭔가를 저장

  • 일부 변환을 할 JMS 대기열에서

    • 잡아 메시지, 검증 등
    • : 것 같습니다 JMS 브로커가없고 DB가없는이 경로를 유닛 테스트하고 싶습니다. 프로세서 구현을 모의 할 수는 있지만 충분하지 않습니다. 나는이 경로를 바꾸고 싶지 않다. (jar 파일에 그 클래스가 있다고 가정 해보자.) Camel in Action (6.2.6 절)에서 알 수 있듯이, 엔드 포인트 및 다른 것들의 모의 객체를 사용할 수 있도록하기 위해 필자는 라우트 엔드 포인트 정의를 변경해야합니다 (책의 예에서는 "mina : tcp :// 미란다 "에서"모의 : 미란다 "등).

      경로 정의를 변경하지 않고도 전체 흐름을 테스트 할 수 있습니까? RouteBuilder를 별도의 클래스로 사용한다면 경로 정의를 "복사하여"수동으로 변경해야합니다. 그것은 잘못된 것을 테스트하지 않습니까?

      나는 Camel에 새로 왔고 나에게 경로를 개발하는 동안 단원 테스트를 할 수있어서 정말 멋지다. 뭔가를 바꿀 수 있으려면 작은 테스트를하고 결과를 관찰하십시오.

  • 답변

    23

    RouteBuilder 클래스가 엔드 포인트를 하드 코드 한 것으로 가정하면 테스트하기가 다소 어려워집니다. 그러나 엔드 포인트 uris에 대한 속성 자리 표시자를 사용하는 RouteBuilder의 경우 단위 테스트를 위해 다른 엔드 포인트 uri 세트를 사용할 수 있습니다. 카멜 서 6 장에서 설명했다.

    다음과 같이 그들은 당신이 당신의 단위 테스트의 기능과 조언을 사용할 수있는 하드 코딩하는 경우 :

    이 낙타 2.7에서 우리는이 부분을 제거 할 수 있도록, 훨씬 쉽게 경로를 조작하는 것이 가능하게 http://camel.apache.org/advicewith.html 교체 부품 등이 있습니다.

    예를 들어 메시지를 데이터베이스 엔드 포인트로 보내도록 시뮬레이션하려면 위의 코드를 사용하여 to를 대신 모의 객체로 보내는 다른 코드로 바꿀 수 있습니다. 이전 릴리스에서는

    당신은 또한 낙타 책에 포함되어있는 interceptSendToEndpoint 트릭 (섹션 6.3.3)를 사용할 수 있습니다

    오, 당신은 또한 모의 구성 요소 부품을 교체 할 수 있습니다 낙타 지금 169 페이지에 표시된 2.8 이후 모의 구성 요소는 더 이상 알지 못하는 URI 매개 변수에 대해 불평하지 않습니다. 즉, 구성 요소 수준에서 구성 요소를 mock으로 대체하는 것이 훨씬 쉽습니다.

    3

    나는 내가 다른 경로를을 가질 수 있도록 내 스프링 파일에 다음 내가 런타임에 교체되는 stock.out = XXXX을 테스트 클래스 경로에 shop.properties에

    <bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent"> 
         <property name="location" value="classpath:shop.properties"/> 
        </bean> 
    
        <route> 
         <from uri="direct://stock"/> 
         <to uri="{{stock.out}}"/> 
        </route> 
    

    이 런타임 및 테스트 용

    6.1에서 더 좋은 예입니다.당신이 클로스 입센의 대답에 따라 엔드 포인트를 교환하기 위해 차단과 조언을 사용할 수 있지만 여러 환경

    0

    6 단위 테스트는, 나는 당신의 검사 결과가 '때로 믿을 수 있도록 경로가 Endpoint 인스턴스를 수용 할 수 있도록 훨씬 더이라고 생각 프로덕션 엔드 포인트 URI에 연결됩니다.

    public class MyRoute extends RouteBuilder { 
        private Endpoint in; 
        private Endpoint out; 
    
        // This is the constructor your production code can call 
        public MyRoute(CamelContext context) { 
         this.in = context.getEndpoint("http://someapi/someresource"); 
         this.out = context.getEndpoint("activemq:somequeue"); 
        } 
    
        // This is the constructor your test can call, although it would be fine 
        // to use in production too 
        public MyRoute(Endpoint in, Endpoint out) { 
         this.in = in; 
         this.out = out; 
        } 
    
        @Override 
        public void configure() throws Exception { 
         from(this.in) 
         .process(exchange -> { 
          // Do stuff with exchange 
         }) 
         .to(this.out); 
        } 
    } 
    

    다음과 같이 테스트 할 수있다 : 예를 들어

    , 당신은 당신이 그것을 가능하게 할 수

    public class MyRoute extends RouteBuilder { 
        @Override 
        public void configure() throws Exception { 
         from("http://someapi/someresource") 
         .process(exchange -> { 
          // Do stuff with exchange 
         }) 
         .to("activemq:somequeue"); 
        } 
    } 
    

    같은 것이과 같이 엔드 포인트를 주입 보이는 RouteBuilder이 있다고

    public class MyRouteTest { 
        private Endpoint in; 
        private MockEndpoint out; 
        private ProducerTemplate producer; 
    
        @Before 
        public void setup() { 
         CamelContext context = new DefaultCamelContext(); 
    
         this.in = context.getEndpoint("direct:in"); 
         this.out = context.getEndpoint("mock:direct:out", MockEndpoint.class); 
         this.producer = context.createProducerTemplate(); 
         this.producer.setDefaultEndpoint(this.in); 
    
         RouteBuilder myRoute = new MyRoute(this.in, this.out); 
         context.addRoutes(myRoute); 
    
         context.start(); 
        } 
    
        @Test 
        public void test() throws Exception { 
         this.producer.sendBody("Hello, world!"); 
         this.out.expectedMessageCount(1); 
         this.out.assertIsSatisfied(); 
        } 
    } 
    

    다음과 같은 이점이 있습니다.

    • 테스트는 매우 간단하고 이해하기 쉬운, 심지어 CamelTestSupport 또는 다른 헬퍼 클래스
    • CamelContext은 그래서 당신은 시험에만 경로가 있는지 확인 할 수 있습니다 손으로 만든
    • 을 확장 할 필요가 없습니다
    • 만든 테스트는 생산 경로의 URI에 대해 상관하지 않는다
    • 당신은 여전히이의 편의를 원하는 경우 경로 클래스로 엔드 포인트 URI를 하드 코딩
    관련 문제