Тестовые ресурсы зависимостей не в 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