2010-03-22 3 views
1

JUnit 테스트를 실행하는 데 문제가 있습니다.내 JUnit 테스트가 Ant에서 실행될 때 getPackage()가 null을 반환합니다.

Eclipse에서 제대로 실행되지만 지금은 Ant를 사용하여 명령 줄에서 실행하려고합니다. 문제는 다음 코드가 null을 반환한다는 것입니다 : getClass().getPackage().

나는 그렇게처럼 내 JUnit 테스트를 실행 해요 : 나는 오류 이런 종류의에 대한 구글에서, 그리고 잘못된 행동을 클래스 로더에 대한 참조의 번호를 발견

<junit fork="no" printsummary="yes" haltonfailure="no"> 
     <classpath refid="junit.classpath" /> 
     <batchtest fork="yes" todir="${reports.junit}"> 
      <fileset dir="${junit.classdir}"> 
       <include name="**/FileHttpServerTest.class" /> 
       <exclude name="**/*$*" /> 
      </fileset> 
     </batchtest> 
     <formatter type="xml" /> 
     ... 

. 그러나 나는 내 문제를 해결할만한 충분한 정보를 얻지 못했다.

null을 반환하지 않으려면 getClass().getPackage()이 필요합니다. 누구든지 나를 도울 수 있습니까?

감사합니다, 필

+0

getClass(). getPackage 호출을 수행하는 코드를 게시 할 수 있습니까? –

답변

1

난 당신이 getClass(). getPackage을하려고하는 개체에 대한 확실하지 않다()? Javadoc이이 메서드에 대해 말하는 것을 살펴보면 getPackage() 작업을 수행하는 개체가 하나씩로드되는 반면 JUnit은 명령 줄에서 JUnit을 실행하는 경우 Bootstrap 클래스 로더에 의해로드되는 것입니다. 자식 클래스 로더의

이것이 합리적인지는 확실하지 않지만 getPackage가 Bootstrap 클래스 로더를 사용하여 패키지를 찾으려고 시도하며 표준 클래스 로더 동작이 해당 하위를 조사하지 않으므로 null을 반환합니다. 당신은이 작업을 수행되는 객체에 대한 자세한 아이디어를 줄 수있는 경우

, 당신은 꽤 합리적 클래스 로딩 분리하고 문제를 해결할 수,

+0

안녕하세요 Fazal, 처음에는 제 3 자 Jetty 클래스'org.mortbay.jetty.Server'에서 문제를 관찰했습니다. NullPointerException을 발생시키는 getClass(). getPackage(). getImplementationVersion()을 호출합니다. 내가 다음 내 테스트 클래스 자체 ('FileHttpServerTest')에 다음 행을 추가 : 은'에서 System.out.println이 (. "패키지가"+ getClass() getPackage는());' 이 인쇄 "패키지입니다 없는". –

1

junit fork="yes"으로 테스트를 실행 해보십시오 더 구체적인 수 있습니다. 이 클래스 로더의 잘못이 있다면

+0

감사합니다 Yishai, 나는 그것을 시도하고 그것은 아무런 차이가 없었습니다 –

+0

@philharvey, 차이점을 만들지 않았는지, 자신의 FileHttpServerTest 클래스 또는 Jetty 클래스 또는 둘 다? – Yishai

+0

불행히도이 두 클래스에서 getObject(). getPackage()를 호출 한 결과에는 차이가 없습니다. –

1

, 당신은 항상 다른 클래스 로더를 사용하여 같은 클래스를로드 할 수

URLClassLoader cld = new URLClassLoader(new URL[] { urlsToClasses }); 
Class.forName(getClass().getName(), true, cld).getPackage(); 

여기서 문제가 클래스 경로의 URL을 찾는 방법, (urlsToClasses)를 파악하는 것입니다. JUnit 클래스 로더에 익숙하지 않아서 Thread.currentThread().getContextClassLoader()URLClassLoader으로 전송하면 URL을 얻는 데 도움이되는지 알 수 있습니다.

관련 문제