У меня есть maven-проект с некоторыми модулями.Один модуль содержит один 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" (в первом модуле) он использует Properties и InputStream для чтения / анализа XML-файла:
InputStream xmlStream = getClass().getResourceAsStream("Data.xml");
Properties properties = new Properties();
properties.loadFromXML(xmlStream);
"data.xml "находится в каталоге resources / foo / firstModule первого модуля, и в первом модуле проверяется OK.
Кажется, что при тестировании второго модуля maven не может правильно загрузить Data.xml в первомmodule.
Я думал, что смогу решить проблему с помощью 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 в каталог classes / foo / firstModule /, изатем запустите тесты.
И действительно, он скопирован в правильный каталог, я могу найти файл «Data.xml» в каталоге «target / classes / foo / firstModule».Но maven test все еще жалуется, что не может прочитать файл (Properties.loadFromXML () выбрасывает NPE).
Я не знаю, как решить эту проблему.Я пробовал другой выходной каталог, такой как $ {project.build.directory} / resources и $ {project.build.directory} / test-classes, но все напрасно ...
Есть какие-нибудь советы сейчас?Спасибо заранее.
Среды: Maven 2.2.1, eclipse, m2eclipse
---- обновлено ----
Извините, я забыл упомянуть, чтоПрограмма во 2-м модуле, расширяет парсера в 1-м модуле, а в конструкторе парсера свойства загружаются и анализируются.Фактически, Program - это еще один Parser с дополнительными возможностями ... ...
Я думаю, это может быть связано с тем, что Программа расширяет Parser , вызывая проблему (возможно, проблемы с загрузчиком классов).
Если я отключу «наследование», инициализируя (новый) парсер в программе, все будет в порядке, тест пройден!Но я не могу изменить отношения наследования ... оно разработано ...
Есть какие-нибудь решения сейчас?
---- обновить с полным кодом ----
ThisParser в первом модуле:
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;
}
}
Это пройденный тест Parser.
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 во втором модуле, который расширяет Parser в первом модуле:
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());
}
}
Вышеприведенный тестовый пример не удался, потому что Properties.loadFromXML (Properties.java:851) выбрасывает NPE
Однако, если я не расширяю Parser, просто измените Parser:
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?Спасибо заранее.