2012-02-28 9 views
1

私は、スプリングテストサポートを使用する統合テストでエンドポイントを模倣する「正しい」方法を理解しようとしています。スプリング構成のcamelContextを使用したCamelエンドポイントの模擬

コードは機能していますが、これが正しい方法であるかどうかは疑問です。私はラクダテストキットを見てきましたが、それはadviceWithですが、それは春がテストでラクダコンタクトをロードする責任があるときには役に立ちませんか?

これは私が持っているものです:

@Service 
public class FtpOutboundFileStrategy implements OutboundFileExportStrategy { 
    private final String FTP_PATTERN= "{0}://{1}@{2}"; 
    private final ProducerTemplate producerTemplate; 

    @Autowired 
    public FtpOutboundPriceFileStrategy(ProducerTemplate producerTemplate) { 
     this.producerTemplate = producerTemplate; 
    } 

    @Override 
    public void doExport(OutboundFile file, ExportProperties exportProperties) { 
     this.producerTemplate.sendBodyAndHeader(createFtpUri(exportProperties), 
       file.getFileContent(), Exchange.FILE_NAME, file.getFileName()); 
    } 
} 

統合テスト:

サービス今

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:testDB.xml", "classpath:applicationContext.xml"}) 
public class FtpOutboundFileStrategyIT { 

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

    @Autowired 
    FtpOutboundFileStrategy ftpOutboundPriceFileStrategy; 

    @Autowired 
    protected CamelContext camelContext; 

    @DirtiesContext 
    @Test 
    public void directsToFtpEndpoint() throws Exception { 
     camelContext.addEndpoint("ftp://[email protected]", fakeEndpoint); 

     fakeEndpoint.expectedBodyReceived().equals("This is the file"); 
     ftpOutboundPriceFileStrategy.doExport(new OutboundFile("This is the file"), 
       new ExportProperties("foo", "localhost")); 
     fakeEndpoint.assertIsSatisfied(); 
    } 
} 

、これは動作しますが、私は場合は思ったんだけどこれはハックのようなものです:

camelContext.addEndpoint("ftp://[email protected]", fakeEndpoint); 

@EndpointInject(uri = "mock:ftp")を使用すると、デフォルトのFtpEndpointよりも高い現在の値を持つ模擬エンドポイントが作成されますが、これをそのままにしておくと、デフォルトを使用しているためテストが失敗します。

別の奇妙なことは、私はを使用する場合は、「FTP *」代わり「のftp:// fooのする@ localhostの」のことですモックではこれがあることを信じるように私を導いた、テストは同様に失敗したURIそれを行う正しい方法ではありません。

すべてのヘルプは大歓迎です!

答えて

3

David Valeriは、純粋なSpring Test Kitを使用して多くのCamelの処理を行うことができるように、Camel-Test-Springの改善に取り組んでいると思います。 JIRAチケットがあるので、今後の改善を見守ってください。まず

あなたがなどのエンドポイントモック

で春XMLについてこのFAQを参照してください、テストを実行するときに、あなたが実際のftpのエンドポイントを置き換えることができ、エンドポイントURIを置き換えるために、春のプロパティプレースホルダを使用できますがまた、実際のエンドポイントurisを含むtest.propertiesファイルとproduction.propertiesファイルがあります。また、Camel in Actionの書籍の第6章では、Springプロパティプレースホルダを使用したテスト方法についても説明しています。

あなたのテスト方法の代わりに、キャメルのadvice-with APIを使用して、テストを実行する前にルートとその他のものを変更することができます。詳細はこちらをご覧ください:http://camel.apache.org/advicewith.html

+0

ありがとう!この特定のケースでは、エンドポイントURIが動的(ExportPropertiesによって決定される)であることを望んでいるので、私は手動でエンドポイントモックを手動で追加する必要があると思いますか?また、私はどのルートも使用していないので、それはadwiceWith APIが役に立たないことを意味します。または、ProducerTemplateを直接呼び出すと動的なルートが作成されますか? – ebaxt

+0

アドバイスなしは経路にのみ適用されます。 ProducerTemplateは、レジストリから直接エンドポイントを検索します。カスタムEndpointStrategyを使用してCamelContextへのaddRegisterEndpointCallbackを使用して登録すると、どのエンドポイントが登録されているかに影響を与えることができます。しかし、それはちょっと自分自身でやっていますし、Camelがその傍受してエンドポイントに送ってモックに送る方法もあります。 –

+0

もう一度ありがとう!最後の質問:)私は手動でFtpEndpointを手動で "置き換える"ことはできません: 'camelContext.addEndpoint(" ftp "、fakeEndpoint);'?私はプロトコルが、それが発送されたエンドポイントの実装を決定したと思いましたか?もしそうならホストが何であるかは本当に問題ではありませんか?それを動作させるために、私は完全にuriでエンドポイントを明示的に置き換える必要があります: 'camelContext.addEndpoint(" ftp:// foo @ localhost "、fakeEndpoint);'。 – ebaxt

0

mockAllEndpoints Camel(> 2.7)の新機能を使用して、a small articleを書きました。 公式文書hereもあります。

+0

私はルートを定義していないので、これは当てはまりません。代わりにプロデューサテンプレートを直接使用しますか? – ebaxt

0

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = MyConfigurationClass.class) 
//this could be an xml file as well with locations attribute 
public class CamelRoutesTest extends AbstractJUnit4SpringContextTests{ 

でテストクラスを拡張してみ私は同様の問題がありました。この固定されたcamelContextとapplicationContextに関連する問題

関連する問題