我目前正在嘗試使用Apache Camel測試現有路由,但我不確定我是否正確地做了這件事,因爲我沒有完全理解Camel背後的所有概念。使用Apache Camel進行測試AdviceWith和weaveById
話雖這麼說,這裏是我想要做的,在下面的例子路線是什麼:
public class TestExampleRoute extends SpringRouteBuilder {
/** The Constant ENDPOINT_EDOSSIER_IMPORT. direct:edossierImport */
public static final String ENDPOINT_EXAMPLE = "direct:testExampleEndpoint";
@Override
public void configure() throws Exception {
// @formatter:off
from(ENDPOINT_EXAMPLE).routeId("testExample")
.bean(TestExampleProcessor.class, "getImportDocumentProcess").id("getImportDocumentProcess")
.bean(TestExampleProcessor.class, "createImportDocumentTraitement").id("createImportDocumentTraitement")
.to(BaseEndpoint.LOG_MESSAGE_SHOW_ALL_MULTILINE);
// @formatter:on
}
}
這裏的關鍵是隻是爲了獲取一個ImportDocumentProcess並創建一個ImportDocumentTraitement取決於上一個對象。 ImportDocumentProcess通過交換。
這裏是處理器代碼:
@Component("testExampleProcessor")
public class TestExampleProcessor {
/** The Constant LOGGER. */
private static final Logger LOGGER = LogManager.getLogger(TestExampleProcessor.class);
@Autowired
ImportDocumentTraitementService importDocumentTraitementService;
@Autowired
ImportDocumentProcessDAO importDocumentProcessDAO;
@Autowired
ImportDocumentTraitementDAO importDocumentTraitementDAO;
// ---- Constants to name camel headers and bodies
private static final String HEADER_ENTREPRISE = "entreprise";
private static final String HEADER_UTILISATEUR = "utilisateur";
private static final String HEADER_IMPORTDOCPROCESS = "importDocumentProcess";
public void getImportDocumentProcess(@Header(HEADER_ENTREPRISE) Entreprise entreprise, Exchange exchange) {
LOGGER.info("Entering TestExampleProcessor method : getImportDocumentProcess");
Utilisateur utilisateur = SessionUtils.getUtilisateur();
ImportDocumentProcess importDocumentProcess = importDocumentProcessDAO.getImportDocumentProcessByEntreprise(
entreprise);
exchange.getIn().setHeader(HEADER_UTILISATEUR, utilisateur);
exchange.getIn().setHeader(HEADER_IMPORTDOCPROCESS, importDocumentProcess);
}
public void createImportDocumentTraitement(@Header(HEADER_ENTREPRISE) Entreprise entreprise,
@Header(HEADER_UTILISATEUR) Utilisateur utilisateur,
@Header(HEADER_IMPORTDOCPROCESS) ImportDocumentProcess importDocumentProcess, Exchange exchange) {
LOGGER.info("Entering TestExampleProcessor method : createImportDocumentTraitement");
long nbImportTraitementBefore = this.importDocumentTraitementDAO.countNumberOfImportDocumentTraitement();
ImportDocumentTraitement importDocumentTraitement = this.importDocumentTraitementService.createImportDocumentTraitement(
entreprise, utilisateur, importDocumentProcess, "md5_fichier_example_test", "fichier_example_test.xml");
long nbImportTraitementAfter = this.importDocumentTraitementDAO.countNumberOfImportDocumentTraitement();
exchange.getIn().setHeader("nbImportTraitementBefore", Long.valueOf(nbImportTraitementBefore));
exchange.getIn().setHeader("nbImportTraitementAfter", Long.valueOf(nbImportTraitementAfter));
exchange.getIn().setHeader("importDocumentTraitement", importDocumentTraitement);
}
}
我看了一下AdviceWith一些事情和WeaveById,我想提出考驗航線的兩片之間的交流狀態。
這裏是我的一個處理器測試的嘗試:
@ContextConfiguration(locations = { "classpath:/camel-context.xml" })
public class TestExampleProcessorTest extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() {
return new TestExampleRoute();
}
@Override
public boolean isUseAdviceWith() {
return true;
}
@Before
public void mockEndPoints() throws Exception {
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
weaveById("getImportDocumentProcess").replace().multicast().to("mock:catchTestEndpoint");
}
});
}
@Test
public void testAdvised() throws Exception {
MockEndpoint mockEndpoint = getMockEndpoint("mock:catchTestEndpoint");
context.start();
mockEndpoint.expectedMessageCount(1);
mockEndpoint.assertIsSatisfied();
context.stop();
}
}
最後一件事:我使用駱駝2.18.0。
我該如何測試每條路由之間的交換狀態? 我錯過了什麼?
編輯:剛纔編輯的測試類的代碼(編譯和作品),但我得到以下斷言錯誤:
java.lang.AssertionError: mock://catchTestEndpoint Received message count. Expected: <1> but was: <0>
這增加了一個問題:爲什麼沒有抓到消息正確嗎?
感謝您的幫助。
就是這樣!愚蠢的錯誤,但正如我所說,我不是駱駝專家。非常感謝你的幫助 ! – matthieusb
如果有人有興趣,我花時間來添加關於此的文檔條目:https://stackoverflow.com/documentation/apache-camel/10630/integration-testing-on-existing-routes-with-apache-camel-和彈簧 - 的DbUnit#噸= 20170625154427774471 – matthieusb