maven test не может загрузить кросс-модульные ресурсы / свойства? - PullRequest
0 голосов
/ 05 июня 2010

У меня есть 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?Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 07 июня 2010

Согласен, это звучит как проблемы с загрузчиком классов.

Если вы всегда намереваетесь использовать Data.xml в /foo/firstModule/Data.xml месте, попробуйте в foo.firstModule.Parser:

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

Или, если вам явно нужно поведение поиска «локального» Data.xml, если firstModule должен использоваться повторно в другом месте (например, secondModule или thirdModule имеет свой собственный Data.xml), попробуйте это

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

0 голосов
/ 05 июня 2010

Кажется, что при тестировании второго модуля maven не может правильно загрузить Data.xml в первый модуль.

Я создал точно такую ​​же структуру и не могу воспроизвести вашу проблему. Мой класс Program во втором модуле использует класс Parser из первого модуля, который загружает свойства из файла XML без проблем . Протестировано в Eclipse и в командной строке.

Я думал, что смогу решить проблему, используя maven-dependency-plugin:unpack для ее решения.

Использование dependency:unpack определенно не является решением, и если первый JAR содержит foo/firstModule/Data.xml, использование класса Parser из другого модуля должно просто работать. Там должно быть что-то не так где-то еще. Если вы можете загрузить типовой тестовый проект, пожалуйста, сделайте это, и я посмотрю на ti. Боюсь, что без проекта, позволяющего воспроизводить, лучшим ответом будет «отладка вашего кода»:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...