2012-01-19 8 views
5

Ở đây DB chỉ là một ví dụ. Nó có nghĩa là một cái gì đó không thể được chuẩn bị trong môi trường thử nghiệm đơn vị.Làm thế nào để đơn vị kiểm tra một tuyến đường với một đậu sẽ truy cập DB?

Cân nhắc lộ trình dưới đây:

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

Khi làm bài kiểm tra đơn vị, là có phương pháp nào để chế giễu các 'dbBean'? Trong thử nghiệm đơn vị, thật khó để thiết lập một DB thực.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

3

Camel có bộ kiểm tra, cho phép bạn thao tác tuyến đường trước khi được kiểm tra. Sau đó, bạn có thể giữ cho các tuyến đường bị ảnh hưởng, và sau đó thay thế các phần của tuyến đường, và không có gì. Một chút phức tạp và tài liệu của nó là chức năng tư vấn ở đây: http://camel.apache.org/advicewith.html

Nó thường hoạt động dễ dàng hơn nếu EIP có ID được chỉ định, sau đó bạn có thể tham khảo các id đó và thay thế bằng id khác.

Tuy nhiên nếu bạn biết rằng bạn muốn thay thế BeanDefinition đầu tiên bạn có thể làm:

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

Xem các liên kết trên làm thế nào để sử dụng này với những lời khuyên với các trong Kit Camel thử nghiệm (ví dụ như lạc đà-test) JAR.

Xin lưu ý rằng bạn nên nói với Bộ kiểm tra Camel rằng bạn đang sử dụng lời khuyên, mà bạn đã làm như được ghi ở cuối liên kết đó.

1

bạn có thể sử dụng một cơ sở dữ liệu nhúng (DERBY, vv) ... đây là một ví dụ lấy từ một 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> 

Nếu không, bạn có thể thử sử dụng DBUnit (để thiết lập kiểm tra cơ sở dữ liệu) hoặc Mockito (để mô phỏng đáp ứng của cuộc gọi DB)

+1

Giải pháp tốt cho thử nghiệm đơn vị DB. Tuy nhiên, đối với một số loại đậu khác, có thể khó mô phỏng môi trường. Tôi nghĩ chế giễu đậu là một cách tiếp cận tốt hơn. – Javen

+0

vâng, tôi hiểu hoàn toàn ... Mockito là tuyệt vời nếu bạn có thể làm cho nó để chơi tốt đẹp với thiết lập của bạn ... nếu không, Claus đề xuất một số phương pháp khác (advicewith, vv) mà sẽ làm việc tốt ... may mắn –

1

Nếu DbBean của bạn là một giao diện, khi đó bạn có thể có 2 cách triển khai khác nhau. Một cho công việc DB thực sự. Và khác cho thử nghiệm đơn vị giả, nơi bạn mô phỏng DB.

Sau đó, nó chỉ là vấn đề instantiating một mô hình trong đơn vị thử nghiệm của bạn

DbBean db = new MockDbBean() 

Như mã Java chỉ đơn giản của nó. Bạn có thể có một getter/setter trong lớp RouteBuilder bạn

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"); 
    } 
} 

Sau đó, từ một đơn vị kiểm tra của nó chỉ là vấn đề thiết lập các MockDbBean sử dụng một setter trên dụ MyRouteBuilder.

+0

Vì vậy Tôi nghĩ rằng chìa khóa phơi bày đậu trong đường ra bên ngoài. Khi làm bài kiểm tra đơn vị, đặt đậu giả vào tuyến đường thử nghiệm. Nhưng có cách nào để lấy đậu trực tiếp từ ngữ cảnh lạc đà và thay thế nó bằng đậu giả không? Bằng cách này, tôi không cần phải sửa đổi lộ trình hiện tại và không cần thêm trường và getter/setter. – Javen