Тестовые ресурсы зависимостей не в classpath?

У меня есть проект с несколькими модулями Spring, который я настраивал с помощью Maven:

my-root (pom)
    - my-logic
    - my-webapp (depending on my-logic)
    - my-consoleapp (depending on my-logic)

Наборы My Test наследуют от AbstractTransactionalJUnit4SpringContextTests и используют @ContextCofiguration для настройки ApplicationContext.

например. тестовый класс для контроллера Spring:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 
  "classpath:applicationContext-logic-test.xml",
  "classpath:applicationContext-web-test.xml"})
public class ControllerTest extends AbstractTransactionalJUnit4SpringContextTests {

  @Autowired
    private ApplicationContext applicationContext;
    ...
}

Как вы видите, есть XML файл конфигурации для каждого модуля. У меня есть отдельные конфигурации для tesing, которые находятся в тесте/ресурсах каждого модуля (и дополнительно имеют суффикс "тест" ). Все это работает (компиляция классов, прогоны и тесты JUnit успешны) , если Я запускаю тест JUnit в Eclipse.

Теперь к моей проблеме: Запуск теста с использованием Maven не будет работать! (например, с помощью "Запустить как" > "Установка Maven" на my-root (я использую m2eclipse)). В частности, это вызовет следующее исключение:

java.io.FileNotFoundException: ресурс пути класса [applicationContext-logic-test.xml] не может быть открыт, потому что он не существует `

Кажется, что Maven не добавляет файлы из my-logic/src/test/resources в путь к классам, который настроен при выполнении модульных тестов my-webapp.

Как я могу это исправить?

Ответы

Ответ 1

Кажется, что Maven не добавляет файлы из my-logic/src/test/resources в путь к классам, который настроен при выполнении модульных тестов my-webapp.

Нет, действительно, нет. Во-первых, Maven использует двоичные зависимости, которые всегда разрешаются через локальный репозиторий. Во-вторых, двоичные зависимости не включают тестовые материалы.

Но что вы можете сделать:

  • настройте модуль my-logic для создания тестового JAR, используя jar:test-jar
  • настройте модуль my-webapp, чтобы зависеть от этого тестового JAR (с помощью области test).

Для # 1 вам нужно настроить плагин Maven Jar в файле pom.xml my-logic:

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

И Maven создаст JAR с содержимым target/test-classes во время package и установит/разблокирует его.

За # 2 объявите зависимость от тестового JAR в pom.xml my-webapp:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

Это должно сделать это.

Ответ 2

Это по дизайну. Ресурсы тестирования не помещаются в выходной артефакт, поэтому любые тестовые зависимости того, на что вы зависите, не будут доступны даже в вашем пути класса unit test.

Если вы хотите выполнить то, что вы пытаетесь сделать, вы должны создать проект, который содержит ресурсы, необходимые для тестирования, и сделать его зависимым от тестирования как my-logic, так и my-webapp