我有一個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的測試用例? 謝謝先進。
嗨, 請儘量讓計劃擴展解析器和解析器的構造函數,來完成分析工作,並重新運行測試。 ..(這是我的架構工作原理...) 如果它適用於您,我必須更深入地檢查我的代碼... – smallufo 2010-06-05 23:32:34
@smallufo:請更新您的問題以顯示您的代碼,以便我可以重現。 – 2010-06-05 23:46:27
謝謝,我在問題的尾部添加了更多評論。 – smallufo 2010-06-05 23:50:19