2012-10-10 123 views
3

我在CentOS上運行Jenkins 1.478,使用Java 6,Maven 3.0.4,JUnit 4.8.1(Maven項目中的依賴項)和Sonar 3.2.1。我有我的Jenkins Maven 2/3作業設置完成後運行Sonar(設置目標爲「clean package -Pdev」)。該項目是一個帶WAR和EAR模塊的多模塊項目。然而,該插件的聲納部分運行時,許多測試的模具中包含錯誤...爲什麼測試在我的Jenkins-Sonar插件中失敗,但在Jenkins-Maven運行期間沒有失敗?

java.lang.NullPointerException 
     at java.util.Properties$LineReader.readLine(Properties.java:418) 
     at java.util.Properties.load0(Properties.java:337) 
     at java.util.Properties.load(Properties.java:325) 
     at org.parentco.myco.client.test.AbstractHibernateDaoTest.loadmyprojectProps(AbstractHibernateDaoTest.java:252) 
     at org.parentco.myco.client.test.AbstractHibernateDaoTest.setupMockEjbContainer(AbstractHibernateDaoTest.java:235) 
     at org.parentco.myco.client.test.AbstractHibernateDaoTest.setupBeforeClass(AbstractHibernateDaoTest.java:72) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 

例外來源於此代碼塊的最後一行...

final InputStream in = AbstractHibernateDaoTest.class.getClassLoader().getResourceAsStream("myproject.properties"); 
    final Properties props = new Properties(); 
    props.load(in); 

的測試在我的工作的Maven部分中完美運行。有問題的文件位於

./myclient-war/src/main/resources/myproject.properties 

任何人都知道我可以進一步排除故障?我寧願在Sonar中配置一些東西,而不是重新構建我的整個項目以適應Sonar,但我願意提供建議。

+0

您是否嘗試過從計算機運行聲納插件?您應該能夠從命令行傳遞配置,而不必更改pom。 – Augusto

+0

您可以在作業屬性'sonar.verbose = true'中爲聲納指定一個調試標誌。檢查是否提供了更多信息。 – eis

回答

0

嘗試「/myproject.properties」。

ClassLoader cl = AbstractHibernateDaoTest.class.getClassLoader(); 
InputStream inTmp = cl.getResourceAsStream("myproject.properties"); 
if(itTmp==null){ 
    itTmp=cl.getResourceAsStream("/myproject.properties"); 
} 
final InputStream in = inTmp; 
+0

試過了,但沒有骰子。 – Dave

1

這可能是由於聲納創建運行的每個測試單獨的類加載器,雖然我不是很確定。

我相信所有的測試都不符合層次結構?

YourTestClass延伸AbstractHibernateDaoTest

嘗試加載使用即時測試類的類加載器是YourTestClass的文件,而不是總是試圖用類加載器加載它的AbstractHibernateDaoTest

試着改變你的代碼到,

final InputStream in = this.getClass().getClassLoader() 
         .getResourceAsStream("myproject.properties"); 
final Properties props = new Properties(); 
props.load(in); 

這將確保您正在獲取實際測試類的類對象,而不是抽象類,也是直接類的類加載器,而不是已加載的類。

UPDATE: 我 我感覺正在發生的事情是,在你的代碼被用來加載任何資源類加載器,是不是能夠看到Maven的類加載器。請注意,在你的情況下,Maven和特別是maven-surefire-plugin負責設置正確的類路徑。它將在類路徑中添加src/main/resources目錄。

+0

我處於靜態方法,因此我無法使用「this」。我沒有嘗試「ClassName.class.getResourceAsStream ...」,但這也沒有工作。 – Dave

+0

我幾乎可以肯定你可以重構你的代碼來使用你的測試類的類加載器。也許你可以將它作爲參數傳遞給你的靜態方法? –

+0

嗯......他不是已經在使用測試類的類加載器了嗎? 「AbstractHibernateDaoTest」不是測試類嗎? – eis

0

一種可能性是this issue

基於Spring的JUnit測試用的Cobertura插件聲納使用衝突。解決方法是使用JaCoCo或EMMA插件而不是Cobertura。

相關問題