2010-11-29 2 views
3

Недавно я спросил this question относительно вытаскивания бобы из приложенияContext. Ответ был действительно полезным, но теперь кажется, что у меня есть проблема с доступом к этому компоненту из класса вне теста. Другими словами, мой тест создает экземпляр класса, который использует компонент из контекста приложения, но этот компонент продолжает расти до нуля.Итак, СЕЙЧАС, почему мой боб null?

Мой тест устанавливает контекст приложения, как это:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "/applicationContext-test.xml") 
public class SearcherTests { 

Мой тест программно инстанцирует Repository класс:

Repository searcher = new Repository(); 

Мой Repository класс имеет следующую переменную-член:

@Resource 
private MyFactory myFactory; 

Если я правильно понимаю Весну, это должно выглядеть так, для компонента bean с именем myFactory. Согласно тесту, текущий контекст приложения должен быть applicationContext-test.xml, который содержит определение myFactory:

<bean id="myFactory" 
    name="myFactory" 
    class="com.foo.Mocks" 
    factory-method="createMockFactory" /> 

В будущем этот метод завод будет возвращать издеваться. Но на данный момент, он просто возвращает регулярный Factory объект:

public class Mocks { 

public static MyFactory createMockFactory() { 
    return new MyFactory(); 
} 
} 

Когда я запустить приложение из моего браузера, переменная myFactory правильно инстанцированных из определения фасоли в applicationContext.xml. В моем тесте, чтобы убедиться, что мой applicationContext-test.xml работает, у меня есть тот же компонент, который указан как переменная-член, как и в классе Repository. Во время выполнения теста переменная myFactory в файле, содержащем тест, выглядит так, как я ожидал. Однако, когда я добираюсь до класса Repository, переменная myFactory в этом классе равна null. Кажется, что этот класс не создает экземпляр переменной myFactory, основанной на определении компонента в applicationContext-test.xml. Может кто-нибудь сказать мне, почему?

Update

Я изменил переменную searcher так, что это весна фасоли, а не экземпляра класса Repository вручную, и теперь переменная myFactory была заселена в Repository класса. Может кто-нибудь объяснить, почему это должно быть bean для того, чтобы работать?

+1

Как получить `Репозиторий`? Это весенний боб? – axtavt 2010-11-29 18:57:19

+0

Нет, репозиторий не является весенним бобом. Мой тест фактически создает экземпляр класса, который, в свою очередь, создает экземпляр класса Repository. Вся эта реализация выполняется программно. – Samo 2010-11-29 19:09:51

ответ

3

Если вы создаете экземпляр Repository самостоятельно, то Spring не участвует, и зависимости не будут введены. Это не происходит волшебным образом, Spring должна быть в цикле как-то - экземпляр должен быть передан через слои обработки Spring, и прямая инстанция предотвращает это.

Смежные вопросы