2010-03-22 58 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" /> 
     ... 

我用Google搜索了這種錯誤,並發現了一些引用的類加載器來不當行爲。但是我發現沒有任何東西給我足夠的信息來解決我的問題。

我真的需要getClass().getPackage()不返回null。誰能幫我?

感謝, 菲爾

+0

您可以發佈您正在執行getClass()。getPackage調用的代碼嗎? –

回答

1

我不知道哪個對象上,你要做的getClass()。getPackage()? 看什麼API Javadoc中說,對這種方法,我猜想,這個問題是JUnit是由引導類加載器加載,當你在命令行中運行它,而在其上做getPackage對象()操作由一個裝的兒童類加載器。

不知道這是有道理的,但由於getPackage試圖找到使用引導類加載器和標準的類加載器的行爲,不看其子包,則返回null。

如果你能提供有關在其上做此操作的對象更多的想法,我能更具體

+0

Hi Fazal, 我最初在第三方Jetty類org.mortbay.jetty.Server中觀察到問題 - 它調用getClass()。getPackage()。getImplementationVersion(),它會導致NullPointerException。 我然後加入以下行到我的測試類本身('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。

相關問題