CamelBlueprintTestSupport и заполнители свойств схемы в camelContext

Я пытаюсь переписать модульный тест, который ранее использовал контекст весны, чтобы использовать контекст плана и 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, и может дать мне несколько указателей?


person Clauds    schedule 03.11.2015    source источник


Ответы (2)



Я использовал protected String useOverridePropertiesWithConfigAdmin(Dictionary props) как способ успешно переопределить свойства в плане, вы пробовали его использовать? Пример:

protected String useOverridePropertiesWithConfigAdmin(Dictionary props) {
    props.put("demo.sync", true); //Add your properties in
    return "app"; //return pid
}
person fiw    schedule 04.11.2015
comment
Я в курсе этого, да. Но я не хочу переопределять все свойства в тесте, я действительно хочу, чтобы он загружал реальные свойства. - person Clauds; 04.11.2015