Я пытаюсь переписать модульный тест, который ранее использовал контекст весны, чтобы использовать контекст плана и CamelBlueprintTestSupport
. Я видел разные ошибки при разных исполнениях, и, пытаясь заставить его работать, я обновил camel-test-blueprint
до версии 2.15.3
. Теперь он всегда терпит неудачу с той же самой ошибкой:
java.lang.RuntimeException: Gave up waiting for service (objectClass=org.apache.camel.CamelContext)
Основная проблема заключается в том, что заполнитель свойства не может быть разрешен:
Caused by: java.lang.IllegalArgumentException: Property placeholder key: xyz not found
at org.apache.camel.blueprint.BlueprintPropertiesParser.parseProperty(BlueprintPropertiesParser.java:164) ~[camel-blueprint-2.15.3.jar:2.15.3]
Мы используем заполнители свойств чертежа в нашем контексте верблюда и определениях маршрута. Я предполагаю, что в этом нет ничего особенного.
Я попытался создать простой тестовый проект, чтобы воспроизвести проблему, и мне действительно удалось запустить контекст в этом тестовом проекте, однако применение тех же шагов к моему реальному проекту не решает проблему.
В моем тестовом проекте у меня есть следующая простая настройка:
blueprint.xml
<cm:property-placeholder id="appConfig" persistent-id="app" update-strategy="reload" />
<camelContext id="demoContext" xmlns="http://camel.apache.org/schema/blueprint" autoStartup="{{demo.sync}}" >
<route id="demoRoute" autoStartup="{{demo.route.startup}}">
<from uri="timer:test" />
<to uri="log:test" />
</route>
</camelContext>
Тестовый класс
public class RouteTest extends CamelBlueprintTestSupport {
@Override
protected String getBlueprintDescriptor() {
return "OSGI-INF/blueprint/blueprint.xml";
}
@Override
protected Properties useOverridePropertiesWithPropertiesComponent() {
Properties props = new Properties();
props.put("demo.sync", Boolean.TRUE.toString());
return props;
}
@Override
protected String[] loadConfigAdminConfigurationFile() {
URL cfg = this.getClass().getClassLoader().getResource("app.cfg");
return new String[] { cfg.getPath(), "app" };
}
Я обнаружил, что без переопределения useOverridePropertiesWithPropertiesComponent
, чтобы вернуть что-то для заполнителя на camelContext
, это вообще не сработает. Переопределив loadConfigAdminConfigurationFile
, я заставил его загрузить фактические свойства, чтобы заменить второй заполнитель.
Я не уверен, что я делаю что-то неправильно или есть состояние гонки, поэтому мне было интересно, если кто-нибудь получил заполнители свойств чертежа, работающие с CamelBlueprintTestSupport
, и может дать мне несколько указателей?