2011-12-20 28 views
16

Tôi đã có một loạt các thành phần "pipelined" mà tất cả giao tiếp thông qua hàng đợi tin nhắn ActiveMQ. Mỗi thành phần sử dụng Camel để xử lý từng hàng đợi như một điểm cuối. Mỗi thành phần sử dụng các mô hình cơ bản giống nhau:Kiểm tra Camel với MockEndpoints

Basic component pattern

đâu mỗi thành phần tiêu thụ thông điệp tắt của một hàng đợi đầu vào, xử lý thông báo (s), và sau đó đặt 1+ tin nhắn trong một hàng đợi outbound/đầu ra. Hàng đợi "đầu ra" sau đó trở thành hàng đợi "đầu vào" cho thành phần tiếp theo trong chuỗi. Khá cơ bản.

Tôi hiện đang cố gắng cuộn lên tay áo của mình và cung cấp kiểm tra đơn vị cho mỗi thành phần bằng cách sử dụng MockEndpoints do API kiểm tra của Camel cung cấp. Tôi đã rót qua javadocs và một số ví dụ trên trang web của Camel, nhưng gặp khó khăn khi kết nối tất cả các dấu chấm.

Dường như với tôi rằng, đối với mỗi thành phần, một phần của kiểm tra đơn vị của tôi sẽ muốn đạt được ba điều sau đây:

  • thử nghiệm để xem nếu có thông báo chờ đợi vào một đặc biệt "đầu vào "hàng đợi
  • Kéo những thông điệp xuống và xử lý chúng
  • Đẩy thông điệp mới cho một 'đầu ra' hàng đợi và xác minh rằng họ đã làm cho nó có

tôi được Lieve tôi cần phải tạo MockEndpoints cho mỗi hàng đợi như vậy:

@EndpointInject(uri = "mock:inputQueue") 
protected MockEndpoint intputQueue; 

@EndpointInject(uri = "mock:outputQueue") 
protected MockEndpoint outputQueue; 

Vì vậy, bây giờ, trong phương pháp thử JUnit của tôi, tôi có thể thiết lập những kỳ vọng và tương tác với các thiết bị đầu cuối:

@Test 
public final void processMethodShouldSendToOutputQueue() 
{ 
    Component comp = new Component(); 
    comp.process(); 

    outputQueue.assertIsSatisfied(); 
} 

Tôi chỉ không hiểu làm thế nào để dây tất cả mọi thứ lên một cách chính xác:

  • làm thế nào để kết nối comp đến inputQueueoutputQueue MockEndpoints?
  • Đối với mỗi MockEndpoint, làm cách nào để thiết lập kỳ vọng để assertIsSatisfied() kiểm tra xem thư có nằm trong hàng đợi cụ thể hay hàng đợi cụ thể chứa thư không?
+0

http: // stackoverflow. com/questions/5664331/how-to-unit-test-production-routes-in-apache-lạc đà –

Trả lời

11

Adam, có một số cách để thực hiện việc này.

Đối với các thành phần POJO, hộp đen kiểm tra chúng riêng biệt với bất kỳ ngữ cảnh/định tuyến Camel nào để tập trung vào logic nghiệp vụ.

Nếu bạn muốn thực hiện kiểm tra đầu cuối của các tuyến đường, hãy cân nhắc sử dụng một trong các cách tiếp cận này để xác thực rằng mỗi bước trong tuyến đường được thỏa mãn.

  • sử dụng NotifyBuilder để xây dựng biểu thức xác nhận Exchange (hơi phức tạp để có được đầu của bạn xung quanh)
  • sử dụng AdviceWith để tự động thay đổi lộ trình trước khi chạy nó (thêm Log/điểm cuối Mock, vv)

Tôi thích AdviceWith vì nó rất linh hoạt và tận dụng MockEndpoints quen thuộc. Đối với một ví dụ hoàn chỉnh của điều này, xem this unit test

Nói tóm lại, bạn sẽ tạo ra một thử nghiệm đơn vị để tiêm MockEndpoints vào tuyến đường của bạn và sau đó xác nhận đối với họ như thường lệ ...

context.getRouteDefinition("myRouteId").adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     // mock all endpoints 
     mockEndpoints(); 
    } 
}); 

getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); 

template.sendBody("direct:start", "Hello World"); 
+0

Tôi đánh giá cao câu trả lời boday - và có, tôi sẽ thử nghiệm các thành phần riêng biệt (và các phương thức "quy trình" của chúng). Tuy nhiên, như một phần của một loại "kiểm tra tích hợp" giữa các thành phần và hàng đợi đầu vào/đầu ra của chúng, tôi muốn tự động hóa việc xác minh các thông điệp di chuyển một tuyến đường được xác định dài. API AdviceWith có vẻ thú vị và tôi sẽ kiểm tra nó. Nhưng sự tồn tại của nó dường như vô hiệu hóa sự cần thiết cho một MockEndpoint. Bạn có thể làm rõ khi nào nó phù hợp để sử dụng? Và cảm ơn một lần nữa! – IAmYourFaja

+0

Adam, để kiểm tra đầu cuối thực sự, hãy sử dụng AdviceWith để tiêm MockEndpoints tự động vào các tuyến sản xuất hiện tại của bạn. Mock rất mạnh mẽ vì các API thống kê/xác nhận được cung cấp, nhưng KHÔNG được thêm trực tiếp vào các tuyến sản xuất. Tôi sẽ cập nhật câu trả lời của mình với ví dụ về việc này ... –

+0

@boday, bạn có thể hoàn thành ví dụ của bạn về cách gửi 'Exchange' tới tuyến đường không? Tôi hỏi rằng bởi vì nó không phải là rõ ràng với tôi làm thế nào bạn có thể gửi một 'Exchange' vào tuyến' từ'. Cảm ơn trước. – danidemi