2015-08-21 2 views
2

У меня есть Spring JUnit тестер класс MySimpleTester:почему я не могу получить доступ к ApplicationContext из ApplicationContextAware реализован компонент

@

RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:/spring/mySimpleConfig.xml"}) 
public class MySimpleTester { 

@Before 
    public void setUp() throws Exception { 
     myAdapter = (MyAdapter) applicationContext.getBean("myAdapter"); 
    } 

@test 
public void testGetSimpleList() { 
     List<SimpleLink> simpleList = **myAdapter.getSimpleLinksList**(); 
} 

... ...

В классе адаптера У меня есть:

public MyAdapter { 
    public List<SimpleLink> getSimpleLinksList() { 
     List<SimpleLink> simLinks = null; 
     String environment = AppFactory.getPropertiesObj(); 

... ...

class AppFactory implements ApplicationContextAware { 

    private static ApplicationContext context; 

    public void setApplicationContext(ApplicationContext acontext) { 
     context = acontext; 
    } 
    public getPropertiesObj() { 
     return getAppContext().getBean("propertiesBean"); 
    } 

я NullPointerException и видеть, что ApplicationContext является Null здесь.

Однако на SpringJUnitTestRunner класс MySimpleTester Я мог бы найти правильную инициализацию applicationContext. Я не включаю mySimpleConfig.xml и включенные файлы. Метод в MyAdapter класс getSimpleLinksList() отлично работает с веб-приложением при запуске на сервере приложений, и там создается текст приложения.

Только из тестера весны он не может достичь статического контекста приложения AppFactory класса, так как он называется статически через AppFactory.getPropertiesObj(). У меня был правильный путь к классам, так как выполняются другие тестовые классы.

+0

Как бы 'MyAdapter.getSimpleLinksList()' даже скомпилировать с 'AppFactory.getPropertiesObj()' is ** not ** static? – hzpz

+0

В реальной программе у меня есть метод static. При написании здесь я пропустил набор. public static String getPropertiesObj() { return getAppContext(). getBean ("propertiesBean"). toString(); } – stillanovice

ответ

0

Если вы хотите получить доступ к текущему ApplicationContext в MySimpleTester: -

public class MySimpleTester { 

@Autowired 
ApplicationContext applicationContext; 

@Before 
    public void setUp() throws Exception { 
     myAdapter = (MyAdapter) applicationContext.getBean("myAdapter"); 
    } 

@test 
public void testGetSimpleList() { 
     List<SimpleLink> simpleList = **myAdapter.getSimpleLinksList**(); 
} 
+0

Я не понял, что вы имели в виду Амит. Обратите внимание, что MySimpleTester является основным классом Junit, поэтому ему нужен загруженный контекст Xmls. Поэтому мне нужно, чтобы у него был RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (locations = {"classpath: /spring/mySimpleConfig.xml"}). Мое требование в классе AppFactory должно получить тот же ApplicationContext, что и основной класс Junit , Почему AppFactory не может получить ссылку на объект ApplicationContext и является нулевым? – stillanovice

0

Я думаю, что это происходит, как создаются множественные контексты приложения. Объект AplliCationContext должен быть одноточечным. Но когда из статического метода мы снова вызываем applicationContext, он ссылается на совершенно другую конфигируцию. ApplicationContext даже не инициализируется там.

Этого не происходит, когда тот же модуль вызывается из Spring MVC webcontanier. Это происходит только тогда, когда вы пытаетесь использовать классы весеннего тестера RunWith (SpringJUnit4ClassRunner.class). Я могу передать AppContext в бизнес-методе, но я не хочу менять подпись метода bsiness. Я нашел некоторые темы в весеннем сообществе с подобной проблемой.

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

  • Нет связанных вопросов^_^