[SPRING] Autowiring이 Spring 3.1.2, JUnit 4.10.0에서 작동하지 않습니다.
SPRINGAutowiring이 Spring 3.1.2, JUnit 4.10.0에서 작동하지 않습니다.
Spring 3.1.2, JUnit 4.10.0을 사용하고 두 버전 모두에 새로운 기능이 추가되었습니다. 주석 기반 autowiring을 사용할 수 없다는 문제가 있습니다.
아래에는 두 개의 샘플이 있는데, 주석을 사용하지 않고 잘 작동합니다. 두 번째 애노테이션을 사용하면 작동하지 않으며 이유를 찾을 수 없습니다. 나는 spring-mvc-test의 샘플을 거의 따라 갔다.
일:
package com.company.web.api;
// imports
public class ApiTests {
@Test
public void testApiGetUserById() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/com/company/web/api/ApiTests-context.xml");
UserManagementService userManagementService = (UserManagementService) ctx.getBean("userManagementService");
ApiUserManagementController apiUserManagementController = new ApiUserManagementController(userManagementService);
MockMvc mockMvc = standaloneSetup(apiUserManagementController).build();
// The actual test
mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
}
}
userManagementService가 null이며 자동 실행되지 않기 때문에 실패합니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration // should default to ApiTests-context.xml in same package
public class ApiTests {
@Autowired
UserManagementService userManagementService;
private MockMvc mockMvc;
@Before
public void setup(){
// SetUp never gets called?!
}
@Test
public void testGetUserById() throws Exception {
// !!! at this point, userManagementService is still null - why? !!!
ApiUserManagementController apiUserManagementController
= new ApiUserManagementController(userManagementService);
mockMvc = standaloneSetup(apiUserManagementController).build();
// The actual test
mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
}
}
위의 두 테스트 클래스는 동일한 컨텍스트 구성을 사용해야하며 userManagementService는 여기에 정의되어 있습니다.
ApiTests-context.xml :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="user"/>
<property name="password" value="passwd"/>
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
p:dataSource-ref="dataSource" p:mappingResources="company.hbm.xml">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
</props>
</property>
<property name="eventListeners">
<map>
<entry key="merge">
<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
</entry>
</map>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory"/>
<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
<context:annotation-config/>
<tx:annotation-driven/>
<context:mbean-export/>
<!-- tried both this and context:component-scan -->
<!--<bean id="userManagementService" class="com.company.web.hibernate.UserManagementServiceImpl"/>-->
<context:component-scan base-package="com.company"/>
<!-- Hibernate's JMX statistics service -->
<bean name="application:type=HibernateStatistics" class="org.hibernate.jmx.StatisticsService" autowire="byName"/>
</beans>
UserManagementService (인터페이스) 및 UserManagementServiceImpl에는 @Service 주석이 있습니다.
두 가지 사소한 질문 / 관찰 : setup ()은 @Before 주석을 가지고 있더라도 결코 호출되지 않습니다. 게다가, 나는 'test'라는 이름으로 시작하지 않으면 내 테스트 메소드가 실행 / 인식되지 않는다는 것을 알아 차렸다. 그 테스트는 필자가 보았던 모든 봄 - mvc 테스트 샘플에서 그렇다.
Pom.hml :
<dependency>
<groupId>org.junit</groupId>
<artifactId>com.springsource.org.junit</artifactId>
<version>4.10.0</version>
<scope>test</scope>
</dependency>
최신 정보:
이 문제는 maven에서 테스트를 실행할 때만 발생합니다. 내 IDE (IntelliJ IDEA)에서 테스트를 실행하면 좋습니다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.3</version>
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
</configuration>
</plugin>
해결법
-
==============================
1.Autowiring은 구성 요소 검사를 수행하지 않으면 일어날 수 없습니다.
Autowiring은 구성 요소 검사를 수행하지 않으면 일어날 수 없습니다.
왜 코드에서 주석 처리 했습니까?
<!--<context:component-scan base-package="com.company"/>-->
또한 다시 : junit. 일식에 있다면 junit의 POM 및 필터의 종속성 트리 뷰로 이동할 수 있습니다. 당신이 실제로 그 버전을 사용하고 있고 오래된 junit을 가져 오지 않았는지 확인하십시오.
편집 : 좋아, 난 그냥 귀하의 설정을 확인 하고이 일을 할 수있었습니다. 내 유일한 추측은 당신이 어떻게 든 잘못된 테스트 주자로 그것을 실행하여 잘못된 junit을 사용하게 할 수 있다는 것입니다.
2 (SOLVED) 편집 : 따라서 커스텀 버전의 junit을 사용하고 있기 때문에 문제가 발생합니다. Surefire는 제공된 junit 라이브러리를 찾고 찾을 수 없습니다. 결과적으로 junit 3으로 기본 설정됩니다. 이는 앱이 구성로드를 건너 뛰게하는 원인입니다.
다음과 같이 사용자 지정 공급자를 명시 적으로 지정할 수 있습니다.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.3</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.12.3</version> </dependency> </dependencies> </plugin>
하지만 맞춤 리포지토리에서 제대로 작동하지 않는 것으로 나타났습니다. 가능한 경우 표준 버전의 junit을 사용하는 것이 좋습니다.
-
==============================
2.특정 컨텍스트 구성 (예 :
특정 컨텍스트 구성 (예 :
@ContextConfiguration(locations = {"/file1.xml", "/file2.xml" })
(필요한 경우 여러 파일과 함께이 파일을 사용하는 방법을 보여주는 것만으로도 충분할 수 있습니다.)
편집 : 여기에 언급 된 AutowiredAnnotationBeanPostProcessor를 활성화 했습니까? http://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/
-
==============================
3.나는이 같은 문제가 있었다. My @Autowire는 내 IDE (SpringSource STS)에서 작동하지만 Maven을 사용하여 명령 줄에서 빌드 할 때 응용 프로그램 컨텍스트를로드하지 못합니다.
나는이 같은 문제가 있었다. My @Autowire는 내 IDE (SpringSource STS)에서 작동하지만 Maven을 사용하여 명령 줄에서 빌드 할 때 응용 프로그램 컨텍스트를로드하지 못합니다.
문제는 pom.xml에 대한 나의 의존성 때문이었습니다. JUnit의 Spring 버전을 사용하여 오류가 발생했습니다. 이것이 원래 게시물의 근본 원인이라고 생각합니다. 필자는 Maven 플러그인을 코딩 할 필요가 없었다.
내가 바꿨다.
<dependency> <groupId>org.junit</groupId> <artifactId>com.springsource.org.junit</artifactId> <version>4.7.0</version> </dependency>
에
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency>
from https://stackoverflow.com/questions/12529667/autowiring-not-working-in-spring-3-1-2-junit-4-10-0 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 트랜잭션 일시 중지는 어떻게 작동합니까? (0) | 2019.04.18 |
---|---|
[SPRING] Spring AOP로 Hibernate 세션 구성하기 (0) | 2019.04.18 |
[SPRING] Java Spring MVC 템플릿 엔진 (0) | 2019.04.18 |
[SPRING] 폼 포스트와 스프링 컨트롤러를 사용한 UTF-8 인코딩 (0) | 2019.04.18 |
[SPRING] Spring Data Elasticsearch는 Amazon Elasticsearch를 지원합니까? (0) | 2019.04.18 |