2014-10-20 7 views
1

Я использую JUnit, но некоторые тесты имеют некоторые проблемы, эти тесты имеют @Автоматизированную аннотацию внутри фасолей Spring и когда я ссылаюсь на них, то bean-атрибуты @Autowired всегда были NULL.@Autowired с тестами JUnit

Вот пример кода:

 public class Test { 

       protected ApplicationContext ac; 

       @Before 
       public void setUp() { 
        ac = new FileSystemXmlApplicationContext("classpath:config/applicationContext.xml" 
        "classpath:config/test-datasources.xml"); 
       } 

       @Test 
       public void testRun() throws Exception { 
         IManager manager = (IManager)this.ac.getBean("manager"); 
         manager.doSomething(); 
       } 
    } 

    @Service 
    public class Manager implements IManager { 

      public boolean doSomething() throws Exception { 
       ParametersJCSCache parametersJCSCache = new ParametersJCSCache(); 
       String paramValue = parametersJCSCache.getParameter("XPTO"); 
       ... 
      } 
    } 

    public class ParametersJCSCache extends SpringBeanAutowiringSupport { 

      @Autowired 
      private IParameterManager parameterManager; //THIS IS NULL 
    } 

При вызове объекта Менеджер весна генерирует прокси, но при обращении к @Autowired parameterManager объект имеет нулевое значение, и с этим вопросом я не могу проверить этот метод ,

Любая идея, что вызывает это? Почему объект не вводится? Он хорошо работает в контексте веб-приложения, но в тестовом контексте всегда имеет значение NULL.

ответ

0

Выглядит как Параметры JCSCache - это не управляемый Spring компонент. Вы должны сделать эту пружинную фасоль и autowire его в Диспетчере

@Service 
     public class Manager implements IManager { 

       public boolean doSomething() throws Exception { 
        ParametersJCSCache parametersJCSCache = new ParametersJCSCache(); <-- You create a new (non Spring-managed) instance 
        String paramValue = parametersJCSCache.getParameter("XPTO"); 
        ... 
       } 
     } 

Изменения к:

@Service 
public class Manager implements IManager { 

     @Autowired 
     private ParametersJCSCache parametersJCSCache; 

     public boolean doSomething() throws Exception { 
      String paramValue = parametersJCSCache.getParameter("XPTO"); 
      ... 
     } 
} 

@Component 
public class ParametersJCSCache extends JCSCache { 

     @Autowired 
     private IParameterManager parameterManager; //THIS IS NULL 
} 
+0

Исправить. Вот почему я использую Autowired, если ParametersCache - это управляемый весом компонент, мне не нужно иметь Autwired Manager. Это работает в контексте веб-приложения. – bigster

+0

Если параметрыJCSCache - управляемый bean-компонент, не относящийся к Spring, как на самом деле IParameterManager может быть введен в Spring? –

+0

Это тайна, это работает при вызове того же кода, когда я внутри веб-контекста. Использование JUnit не дает такого же поведения. И класс ParametersJCSCache расширяет SpringBeanAutowiringSupport. Забудьте поместить это в код. – bigster

1

Попробуйте запустить модульные тесты с пружинным бегуном вместо.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:config/applicationContext.xml", 
       "classpath:config/test-datasources.xml"}) 
public class MyTest { 

    @Autowired private IManager manager; 

    @Test public void someTest() { 
    assertNotNull(manager); 
    } 
} 

Он будет загружать конфигурации только один раз, и, когда это необходимо, и это будет autowire вашего класса JUnit

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