2009-11-09 3 views
0

이것은 previous question에 대한 후속 질문입니다.JUnit을 사용하여 ServiceLocator 테스트하기

내 ServiceLocator 클래스에 대한 테스트 케이스를 작성하려고하고 있지만, 그것은 나에게 다음과 같은 오류 제공 :

com/iplanet/ias/admin/common/ASException 
java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASException 
     at java.lang.ClassLoader.defineClass1(Native Method) 

내 테스트 케이스 :

public void testServiceLocator() throws UivException, NamingException 
{ 
    DataSource ds = ServiceLocator.getInstance().getDataSource("jdbc/RSRC/my/mydb"); 
    //I have not put any assert statements because i know above line is failing 
} 

위의 코드는 getInstance() 방식에 실패 보이는을 좋아요 :

static public ServiceLocator getInstance() throws UivException { 
    try { 
     if (me == null) { 
      synchronized(ServiceLocator.class) { 
      me = new ServiceLocator(); 
      } 
     } 
     return me; 
    } 
    catch (UivException e) { 
      throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR, 
           ErrorCode.SERVICE_LOCATOR_LOOKUP_ERROR, 
           e.getMessage()); 
    } 
} 

저는 이것을 알고 있습니다. ServiceLocator 잘 동작합니다. 프런트 엔드에서 응용 프로그램을 테스트 할 때 아무런 문제가 없기 때문입니다. 이 테스트 사례를 쓰는 이유는 내 DAO을 테스트하기 때문입니다. 그리고 내 DAO를 테스트하려면 ServiceLocator이 작동해야합니다 (JUnit에서).

나는 오류 메시지의 원인을 알지 못합니다. 누구든지 내가 시도 할 수있는 뭔가를 제안하고 싶습니까?

편집

: ServiceLocator 생성자

private ServiceLocator() throws UivException { 
    try { 
     ic = new InitialContext(); 
     // System.out.println("Created the Initial Context"); 
     cache = Collections.synchronizedMap(new HashMap()); 
    } 
    catch (NamingException ne) { 
     throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR, 
           0, ne.getMessage()); 
    } 
    catch (NullPointerException e) { 
      throw new UivException(ErrorCode.SERVICE_LOCATOR_ERROR, 
           0, e.getMessage()); 
    } 
} 

답변

1

글쎄, 당신은 테스트를 호출 클래스 패스에 com.iplanet.ias.admin.common.ASException입니까?

JDBC 드라이버의 라이브러리를 클래스 경로에 포함 시키려면 앱 서버에 의존하고 계십니까? 아니면 직접 배포할까요?

+0

저는 앱 서버에 의존하고 있습니다. appserver에는 이미 모든 설정이 있으므로 테스트를 작성하고 함께 사용하기를 원했습니다. – Omnipresent

+0

com.iplanet 항목은 Sun App 서버의 관리 속성 인 것 같습니다. 그게 아마 애플 리케이션 서버에서 JDBC 리소스를 얻을 필요했습니다. ...하지만 Junit 테스트는 앱 서버에 '배포'되어 있지 않습니다 ... – Omnipresent

+0

하지만 유닛에서 JDBC 드라이버를로드하려고 호출하는 코드를 테스트하면 단위 테스트를 실행할 때 JDBC 드라이버가 클래스 경로에 있어야합니다. –

2

실제로 오류는 매우 명확합니다. java.lang.NoClassDefFoundError: com/iplanet/ias/admin/common/ASExceptionASException의 정의가 런타임에 발견되지 않음을 나타냅니다.

응용 프로그램 서버에서 실행될 때이 클래스는 iPlanet Application Server에서 제공되며 코드는 정상적으로 실행됩니다. 이 코드를 응용 프로그램 서버 컨텍스트 외부에서 실행하려면 클래스 패스에 "수동"으로 제공해야합니다. 따라서 올바른 iPlanet JAR을 클래스 경로에 추가해야합니다 (이는 까다로운 부분이므로 어떤 것을 찾으셔야합니다).

또한, 당신은비 arg 생성자를 사용하고 있으므로 애플리케이션 서버 내부에서 실행될 때 iPlanet의 환경 설정을 사용하고 있습니다. iPlanet 외부 (예 : 단위 테스트 용)에서는 iPlanet에 적합한 JNDI 등록 정보를 직접 제공해야합니다. 이렇게하려면 클래스 패스에 jndi.properties 파일을 초기 컨텍스트 팩토리와 공급자 URL (최소한)을 넣어야합니다. 다음과 같은 내용이 있습니다.

java.naming.factory.initial=... 
java.naming.provider.url=... 

iPlanet 설명서에서 값을 확인하십시오.

0

서비스 검색 기능을 쓰는 이유가 궁금합니다. 과제의 일부입니까? 현실 세계에서 Dependency Injection은 Guice 또는 Spring을 사용하는 명백하게 우수한 선택입니다.

+0

아니에요. 우리는 여전히 JDBC (ORM과 비교)를 사용하는 오래된 레거시 코드를 가지고 있습니다. 이 레거시 코드를 더 '현실 세계'로 바꾸려고 노력 중입니다. 공유하고 싶은 스프링 주사에 대한 링크가 있습니까? – Omnipresent

관련 문제