복붙노트

[SPRING] @Autowired with JUnit 테스트

SPRING

@Autowired with JUnit 테스트

JUnit을 사용하고 있지만 일부 테스트에는 몇 가지 문제가 있습니다.이 테스트는 @Autowired 주석을 Spring bean 내부에 가지고 있는데, @Autowired 인 Bean은 항상 NULL입니다.

다음은 예제 코드입니다.

     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
    }

Manager 객체를 호출 할 때 Spring은 프록시를 생성하지만 @Autowired 매개 변수 관리자에 액세스 할 때 객체는 null이며이 문제로이 메소드를 테스트 할 수 없습니다.

이 문제의 원인은 무엇입니까? 왜 물체가 주입되지 않습니까? 웹 애플리케이션의 컨텍스트에서 잘 작동하지만 테스트 컨텍스트에서는 항상 NULL입니다.

해결법

  1. ==============================

    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);
       }
    }
    

    config를 한 번만로드하고 필요한 경우 junit 클래스를 autowire합니다

  2. ==============================

    2.드디어 내 문제에 대한 해결책을 찾았습니다. 이 게시물 찾기 SpringBeanAutowiringSupport는 jUnit 테스트에서 bean을 주입하지 않으며 JUnit 테스트가 작동하는 것과 같은 것을합니다.

    드디어 내 문제에 대한 해결책을 찾았습니다. 이 게시물 찾기 SpringBeanAutowiringSupport는 jUnit 테스트에서 bean을 주입하지 않으며 JUnit 테스트가 작동하는 것과 같은 것을합니다.

  3. ==============================

    3.내게는 ParametersJCSCache가 Spring 관리 빈이 아닌 것처럼 보인다. 이것을 Spring 빈으로 만들고 Manager에 autowire해야한다.

    내게는 ParametersJCSCache가 Spring 관리 빈이 아닌 것처럼 보인다. 이것을 Spring 빈으로 만들고 Manager에 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
    }
    
  4. from https://stackoverflow.com/questions/26462926/autowired-with-junit-tests by cc-by-sa and MIT license