2016-11-18 1 views
0

Я пытаюсь использовать специализированный подкласс в веб-приложении Spring для тестирования.Как сделать Spring, чтобы выбрать подкласс в ссылке собственности?

контекста приложения файлов XML ссылки на класс в свойствах в нескольких бина на полное имя класса, например:

<bean id="blahblah" class="x.y.z.Blah"> 
    <property name="myFooAttribute" ref="x.y.z.Foo"/> 
</bean> 

, и я хотел бы создать экземпляр и использовать x.y.z.Bar вместо x.y.z.Foo, везде, где это используемый.

В моем тесте я использую конфигурацию на основе Java и импортирую конфигурацию XML (устаревшие вещи, которые я действительно не хочу слишком много крутить), поскольку это кажется более естественным, когда я собираюсь исправлять вещи и используя mocks, объявленный inline.

@Configuration 
@ImportResource({ 
     "classpath:applicationContext-common.xml", 
     "classpath:app-servlet.xml" 
}) 
static class TestConfig { 
    static class Bar extends Foo { 
     //some stuff overridden here 
    } 

} 

Как я могу сделать все места, которые ссылаются на x.y.z.Foo использовать мой Bar класс вместо этого? Предпочтительно, не меняя xml-файлы ...

+0

Просто добавьте фасоль типа 'Bar' и никого типа' Foo'? – chrylis

+0

Бит 'Foo' не определен нигде, о котором я знаю, я думаю, что он просто создает одноэлементный компонент, поскольку он имеет конструктор по умолчанию без аргументов ... – fortran

+0

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

ответ

0

Создание компонента, названного классом, который вы пытаетесь переопределить. Это может быть достигнуто в конфигурации стиля Java, используя аннотацию Bean.

@Configuration 
@ImportResource({ 
     "classpath:applicationContext-common.xml", 
     "classpath:app-servlet.xml" 
}) 
static class TestConfig { 
    static class Bar extends Foo { 
     //some stuff overridden here 
    } 
    private Bar myTestBar = new Bar(); 
    @Bean(name="x.y.z.Foo") 
    public Foo getFoo() { 
     return myTestBar; 
    } 
}