2012-06-13 3 views
1

Jboss에 배포 한 기존 서비스 bean이 있습니다. 불행히도 그것은 dataSource 참조가 JNDI 서비스의 "mappedName"조회를 통해 데이터 소스 참조를 삽입하도록 구성되었습니다.@Resource dataSource mappedName - 비 JNDI 환경에서 테스트 할 재정의 env

@Resource(name = "dataSource", mappedName = "java:/OracleDS") 
private DataSource dataSource = null; 

비 JNDI 환경에서 Bean을 테스트하고 싶습니다. JNDI가 아닌 환경에서 실행할 때이 예외가 발생할 것으로 예상됩니다.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'myService': Injection of resource fields failed; nested exception 
is org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean 
definition with name 'java:/OracleDS' defined in JNDI environment: JNDI lookup 
failed; nested exception is javax.naming.NoInitialContextException: Need to 
specify class name in environment or system property, or as an applet parameter, 
or in an application resource file: java.naming.factory.initial 

는 난이 후, 생산 테스트 스프링 컨텍스트 데이터 소스를 정의 할 수 있기 때문에, mappedName 제한을 삭제하는 수정하는 빠른 방법을 깨닫는다. 하지만 내가 할 수없는 경우. 위의 예외를 피하기 위해 테스트 봄 컨텍스트를 통해 InitialContext를 정의하는 방법이 있습니까?

답변

0

나는 SimpleNamingContextBuilder에 대해 더 읽었으며이 테스트 케이스를 위해이 컨텍스트 설정을 제안했다. MethodInvokingFactoryBean을 사용하여 bind() 메서드가 호출되도록하는 트릭입니다.

<bean id="jndiContext" class="org.springframework.mock.jndi.SimpleNamingContextBuilder" factory-method="emptyActivatedContextBuilder"/> 

<bean id="invokingFactoryBean" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject"> 
     <ref local="jndiContext" /> 
    </property> 
    <property name="targetMethod"> 
     <value>bind</value> 
    </property> 
    <property name="arguments"> 
     <list> 
      <value>java:/OracleDS</value> 
      <ref bean="dataSource" /> 
     </list> 
    </property> 
</bean> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${datasource.driverClassName}" /> 
    <property name="url" value="${datasource.url}" /> 
    <property name="username" value="${datasource.username}" /> 
    <property name="password" value="${datasource.password}" /> 
</bean>