[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.대신 스프링 러너를 사용하여 단위 테스트를 실행 해보십시오.
대신 스프링 러너를 사용하여 단위 테스트를 실행 해보십시오.
@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.드디어 내 문제에 대한 해결책을 찾았습니다. 이 게시물 찾기 SpringBeanAutowiringSupport는 jUnit 테스트에서 bean을 주입하지 않으며 JUnit 테스트가 작동하는 것과 같은 것을합니다.
드디어 내 문제에 대한 해결책을 찾았습니다. 이 게시물 찾기 SpringBeanAutowiringSupport는 jUnit 테스트에서 bean을 주입하지 않으며 JUnit 테스트가 작동하는 것과 같은 것을합니다.
-
==============================
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 }
from https://stackoverflow.com/questions/26462926/autowired-with-junit-tests by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트 오류 : EmbeddedServletContainerFactory 빈이 없어서 EmbeddedWebApplicationContext를 시작할 수 없습니다. (0) | 2019.05.18 |
---|---|
[SPRING] 최대 절전 모드에서 LIKE % 사용하기 (0) | 2019.05.18 |
[SPRING] Spring : ManyToOne 엔티티를 가져올 때 참조 엔티티 (OneToMany)가 JSON에 표시되지 않습니다. (0) | 2019.05.18 |
[SPRING] Spring / Hibernate에서의 적절한 캐시 사용법 (0) | 2019.05.18 |
[SPRING] jQuery DataTables - DataTable을 다시 초기화 할 수 없습니다. (0) | 2019.05.18 |