2015-11-03 1 views
2

Я пытаюсь переписать единичный тест, который ранее использовал контекст весны, чтобы использовать контекст чертежа и CamelBlueprintTestSupport. Я видел разные ошибки при разных исполнениях, и в процессе попытки его работы я обновил camel-test-blueprint до версии 2.15.3. Теперь он всегда терпит неудачу с такой же ошибкой:Ячейки CamelBlueprintTestSupport и свойства чертежа в camelContext

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 заполнители собственности в нашем контексте верблюд и маршрут определений. Я предполагаю, что в этом нет ничего особенного.

Я попытался создать простой тестовый проект, чтобы воспроизвести проблему, и на самом деле удалось запустить контекст в этом тестовом проекте, однако применение тех же шагов к моему фактическому проекту не решает проблему.

В моем тестовом проекте у меня есть следующий простой установки:

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> 

класс Test

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, и может дать мне несколько указателей?

ответ

0

Посмотрите на этот класс испытаний, предоставленный Клаусом Ибсеном. Он должен дать вам подсказки о том, как решить проблему. https://github.com/apache/camel/blob/master/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/ConfigAdminLoadConfigurationFileTest.java

+0

Если вы посмотрите на мой код, вы увидите, что я уже это делаю. Проблема в том, что она не работает в каждой настройке, например. в моем простом тестовом проекте он работает, но как только я это делаю в реальном проекте, он не работает. – Clauds

0

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

protected String useOverridePropertiesWithConfigAdmin(Dictionary props) { 
    props.put("demo.sync", true); //Add your properties in 
    return "app"; //return pid 
} 
+0

Я знаю об этом, да. Но я не хочу переопределять все свойства теста, я действительно хочу, чтобы он загружал реальные свойства. – Clauds