私は、スプリングテストサポートを使用する統合テストでエンドポイントを模倣する「正しい」方法を理解しようとしています。スプリング構成の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それを行う正しい方法ではありません。
すべてのヘルプは大歓迎です!
ありがとう!この特定のケースでは、エンドポイントURIが動的(ExportPropertiesによって決定される)であることを望んでいるので、私は手動でエンドポイントモックを手動で追加する必要があると思いますか?また、私はどのルートも使用していないので、それはadwiceWith APIが役に立たないことを意味します。または、ProducerTemplateを直接呼び出すと動的なルートが作成されますか? – ebaxt
アドバイスなしは経路にのみ適用されます。 ProducerTemplateは、レジストリから直接エンドポイントを検索します。カスタムEndpointStrategyを使用してCamelContextへのaddRegisterEndpointCallbackを使用して登録すると、どのエンドポイントが登録されているかに影響を与えることができます。しかし、それはちょっと自分自身でやっていますし、Camelがその傍受してエンドポイントに送ってモックに送る方法もあります。 –
もう一度ありがとう!最後の質問:)私は手動でFtpEndpointを手動で "置き換える"ことはできません: 'camelContext.addEndpoint(" ftp "、fakeEndpoint);'?私はプロトコルが、それが発送されたエンドポイントの実装を決定したと思いましたか?もしそうならホストが何であるかは本当に問題ではありませんか?それを動作させるために、私は完全にuriでエンドポイントを明示的に置き換える必要があります: 'camelContext.addEndpoint(" ftp:// foo @ localhost "、fakeEndpoint);'。 – ebaxt