2010-06-05 63 views
0

我有一個maven與一些模塊mantained項目。 一個模塊包含一個XML文件和一個解析類。maven測試無法加載跨模塊資源/屬性?

第二個模塊取決於第一個模塊。 有一個類在第一個模塊中調用解析類,但maven似乎無法在第二個模塊中測試該類。行家測試報告:

java.lang.NullPointerException 
at java.util.Properties.loadFromXML(Properties.java:851) 
at foo.firstModule.Parser.<init>(Parser.java:92) 
at foo.secondModule.Program.<init>(Program.java:84) 

在 「Parser.java」(在第一模塊中),它使用性能及InputStream的讀/解析XML文件:

InputStream xmlStream = getClass().getResourceAsStream("Data.xml"); 
Properties properties = new Properties(); 
properties.loadFromXML(xmlStream); 

的 「data.xml中」位於第一個模塊的resources/foo/firstModule目錄中,並在第一個模塊中測試OK。

看來在測試第二個模塊時,maven無法在第一個模塊中正確加載Data.xml。

我想我可以通過使用解決問題maven-dependency-plugin:解壓來解決它。在第二個模塊的POM文件,我加入這些片段:

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-dependency-plugin</artifactId> 
<version>2.1</version> 
    <executions> 
    <execution> 
     <id>data-copying</id> 
     <phase>test-compile</phase> 
     <goals> 
     <goal>unpack</goal> 
     </goals> 
     <configuration> 
     <artifactItems> 
      <artifactItem> 
      <groupId>foo</groupId> 
      <artifactId>firstModule</artifactId> 
      <type>jar</type> 
      <includes>foo/firstModule/Data.xml</includes> 
      <outputDirectory>${project.build.directory}/classes</outputDirectory> 
      </artifactItem> 
     </artifactItems> 
     </configuration> 
    </execution>   
    </executions> 
</plugin> 

在這個POM文件,我試圖解開第一模塊和data.xml中複製到類/富/ firstModule /目錄,然後運行試驗。

事實上,它被複制到正確的目錄,我可以在「target/classes/foo/firstModule」目錄中找到「Data.xml」文件。但maven測試仍然抱怨它無法讀取文件(Properties.loadFromXML()拋出NPE)。

我不知道如何解決這個問題。 我試過其他輸出目錄,比如$ {project.build.directory}/resources和$ {project.build.directory}/test-classes,但都是徒勞的...

現在有什麼建議?先謝謝了。

環境:Maven的2.2.1,日食,m2eclipse的

---- ----更新

對不起,我忘了提,即第2個模塊中的程序,延伸的解析器在第一個模塊中, 和解析器的構造函數中,屬性被加載和解析。 事實上,程序與其它性能分析器另一個......

我想這可能是因爲計劃擴展分析器,造成問題的原因(也許類加載器的問題)。

如果我斷開「繼承」,初始化(新)程序中的解析器,它會好的,測試通過! 但我不能改變繼承關係......它的設計......

現在的任何解決方案?

----全代碼更新----

這是解析器第一模塊:

package foo.firstModule; 

import java.io.IOException; 
import java.io.InputStream; 
import java.util.InvalidPropertiesFormatException; 
import java.util.Properties; 

public class Parser 
{ 
    private Properties properties; 

    public Parser() 
    { 
    InputStream xmlStream = getClass().getResourceAsStream("Data.xml"); 
    properties = new Properties(); 
    try 
    { 
     properties.loadFromXML(xmlStream); 
    } 
    catch (InvalidPropertiesFormatException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    } 

    public Properties getProperties() 
    { 
    return properties; 
    } 
} 

這是解析器的測試案例,通過。

package foo.firstModule; 

import junit.framework.TestCase; 

public class ParserTest extends TestCase 
{ 
    public void testParser() 
    { 
    Parser p = new Parser(); 
    assertEquals(64 , p.getProperties().size()); 
    } 
} 

這是ParserExtend在secondModule,延伸分析器在firstModule:

package foo.secondModule; 

import java.util.Properties; 

import foo.firstModule.Parser; 

public class ParserExtend extends Parser 
{ 
    private Properties properties; 

    public ParserExtend() 
    { 
    this.properties = getProperties(); 
    } 

    public int getSize() 
    { 
    return properties.size(); 
    } 
} 

這是ParserExtend的測試案例:

package foo.secondModule; 

import junit.framework.TestCase; 

public class ParserExtendTest extends TestCase 
{ 
    public void testParserExtend() 
    { 
    ParserExtend pe = new ParserExtend(); 
    assertEquals(64 , pe.getSize()); 
    } 
} 

上面的測試案例失敗,因爲屬性。 loadFromXML(Properties.java:851)throws NPE

但是,如果我不延長分析器,只是新的解析器:

package foo.secondModule; 

import java.util.Properties; 

import foo.firstModule.Parser; 

public class ParserInit 
{ 
    private Properties properties; 

    public ParserInit() 
    { 
    Parser p = new Parser(); 
    this.properties = p.getProperties(); 
    } 

    public int getSize() 
    { 
    return properties.size(); 
    } 
} 

,這是測試用例:

package foo.secondModule; 

import junit.framework.TestCase; 

public class ParserInitTest extends TestCase 
{ 
    public void testParserInit() 
    { 
    ParserInit pi = new ParserInit(); 
    assertEquals(64 , pi.getSize()); 
    } 
} 

測試用例通過!

這是我的整個測試場景。 任何人都可以找到如何通過ParserExtend的測試用例? 謝謝先進。

回答

0

看來在測試第二個模塊時,maven無法正確加載第一個模塊中的Data.xml。

我創建了完全相同的結構,我無法重現您的問題。我的Program類在第二個模塊中使用了第一個模塊的Parser類,它從XML文件加載屬性而沒有有任何問題。在Eclipse和命令行下進行測試。

我想我可以通過使用maven-dependency-plugin:unpack來解決這個問題。

使用dependency:unpack絕對不是一個解決方案,如果第一個JAR包含foo/firstModule/Data.xml,使用Parser類從另一個模塊應該只是工作。別的地方一定有什麼問題。如果你可以上傳一個有代表性的測試項目,那麼請這樣做,我會看看ti。沒有一個允許重現的項目,恐怕你得到的最佳答案是「調試你的代碼」:)

+0

嗨, 請儘量讓計劃擴展解析器和解析器的構造函數,來完成分析工作,並重新運行測試。 ..(這是我的架構工作原理...) 如果它適用於您,我必須更深入地檢查我的代碼... – smallufo 2010-06-05 23:32:34

+0

@smallufo:請更新您的問題以顯示您的代碼,以便我可以重現。 – 2010-06-05 23:46:27

+0

謝謝,我在問題的尾部添加了更多評論。 – smallufo 2010-06-05 23:50:19

0

我同意,這聽起來像是類加載器的問題。

如果你總是打算在/foo/firstModule/Data.xml位置開始data.xml中,讓這個嘗試在foo.firstModule.Parser

InputStream xmlStream = getClass().getResourceAsStream("/foo/firstModule/Data.xml");

或者,如果你想明確的行爲尋找一個「本地」Data.xml應該首先在其他地方重用(例如,secondModule或thirdModule都有自己data.xml中),試試這個:

InputStream xmlStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("Data.xml");

+0

嗨,感謝您的答覆。 如果我改爲Thread.currentThread()。getContextClassLoader()。getResourceAsStream(「Data.xml」); ParserTest也會失敗。 – smallufo 2010-06-07 09:05:39