2013-07-25 3 views
6

저는 Spring bean 간의 확장 된 결합을 가지고있는 커다란 Spring 기반 프로젝트에 참여하고있는 Spring 초보자입니다. 전체 응용 프로그램 기능의 하위 집합을 실행하는 일부 통합 테스트를 작성하려고합니다. 그렇게하기 위해, autowiring의 일부를 오버라이드하고 싶습니다. 예를 들어, 내가 클래스Spring @Autowire 어노테이션을 오버라이드하고 필드를 null로 설정하는 방법은 무엇입니까?

public class MyDataServiceImpl implements MyDataService { 
    @Qualifier("notNeededForMyDataServiceTest") 
    @Autowired 
    private NotNeededForMyDataServiceTest notNeededForMyDataServiceTest; 
    //... 
} 

하고있는 컨텍스트 파일이 있다고 가정 : 내 테스트에서

<bean id="myDataService" 
     class="MyDataServiceImpl"> 
</bean> 

을, 나는 notNeededForMyDataServiceTest 필드를 사용할 필요가 없습니다. @Autowired 주석을 무시하고 notNeededForMyDataServiceTest을 null로 설정할 수있는 방법이 있습니까? XML 파일입니까? Java 클래스를 수정하고 싶지 않지만 notNeededForMyDataServiceTest의 (문제가있는) 구성을 피하고 싶습니다. 작동하지 않는

<bean id="myDataService" 
     class="MyDataServiceImpl"> 
    <property name="notNeededForMyDataServiceTest"><null/></property> 
</bean> 

:

나는 일을 시도했다. IntelliJ는 "해당 필드에 getter 및 setter가 없으므로"notNeededForMyDataServiceTest '속성을 확인할 수 없습니다. "

저는 Spring Framework 3.1.3을 사용하고 있습니다.

+0

당신은 시도 했습니까 : 이 문자열은 null이 될 것이라고 생각하지만 적어도 값을 설정할 수는 있습니다 – Jayz

답변

5

, 나는 자바 구성

@Configuration 
//This will load your beans from whichever xml file you are using 
@ImportResource("classpath:/path/beans.xml") 
public class TestConfigLoader{ 
    // This will declare the unused bean and inject MyDataServiceImpl with null. 
    public @Bean(name="notNeededForMyDataServiceTest") NotNeededForMyDataServiceTest getNotNeededForMyDataServiceTest(){ 
     return null; 
    } 
... any other configuration beans if required. 
} 

혼합의 자유를했다 그래서 같이 테스트 클래스를 주석 :

// In your test class applicationContext will be loaded from TestConfigLoader 
@ContextConfiguration(classes = {TestConfigLoader.class}) 
public class MyTest { 
    // class body... 
} 
3

다음은 도움이 될 수 :

및 프로파일 :

당신은 XML 구성에서 다른 콩 정의를 생성 한 다음이 -Dspring.profiles.active="profile1,profile2" ENV를 사용하여 활성화 할 수 있습니다. 다음 구성 작동합니다

+0

필요에 따라 멋진 링크 – Jayz

+0

감사합니다. 포인터! 아베에게 보너스를 주겠다. 왜냐하면 그가 코드 예제를 제공했기 때문이다. – kc2001

3

을 당신은 잘못 @Autowired 메커니즘을 사용하고 있습니다. 한정자는 이 아니며 사용자가 설정해야하는 속성 인이 아닙니다. 이것은 실제로 bean의 이름입니다. 그래서 동일한 유형의 여러 bean이 동일한 컨텍스트에서 정의되는 경우 컨테이너는 하나의 특정 인스턴스를 선택할 수 있습니다.

따라서 컨테이너는 NotNeededForMyDataServiceTest 유형의 bean과 실제로 이름이 될 idnotNeededForMyDataServiceTest을 찾습니다.

응용 프로그램 컨텍스트에 NotNeededForMyDataServiceTest 유형의 bean이 정의되어 있지 않으면 해당 필드에 아무것도 삽입하지 않도록 컨테이너에 지시하는 것이 좋습니다.

@Autowired(required = false) 
NotNeededForMyDataServiceTest someOptionalDependency; 

이 방법의 유일한 단점은 해당 필드에 주입 아무것도 존재하지 않는 경우는 컨테이너가 런타임에 불평하지 않을 것이다 것 (그리고 아마도 : 그것은 false에 주석의 required 특성을 설정하여 간단하게 얻을 수있는 프로덕션 환경에서 코드가 실행될 때이 온 전성 체크를 원할 것입니다.


당신이 (또는 어떤 이유로 해당 코드를 편집 할 수 없습니다) 그 종속성을 선택하게하지 않으려면, 당신은 명시 적으로 설정하여 해당 필드에 대한 모의/null 가치를 제공해야합니다 귀하의 맥락에서. 하나의 옵션은 @Abe의 답변처럼 XML 대신 Java 구성을 사용하고 다른 방법은 null (예 : this question)을 반환하는 팩토리 빈을 사용하는 것입니다.

+0

답변 해 주셔서 감사합니다. 불행하게도, 당신 말이 맞아요. 우리는 프로덕션 환경에서 온전한 체크를 원합니다. – kc2001

+0

몇 가지 대안을 제공하기 위해 내 대답을 편집했습니다 ... –

+0

고마워! 나는 당신의 대답과 아베의 보너스를 나누고 싶습니다만, 나는 할 수 없습니다. 아베에게 보너스를 주겠다. 왜냐하면 그가 코드 예제를 제공했기 때문이다. – kc2001

관련 문제