фонУказание профиля Maven при запуске JUnit тестов в Spring веб-приложение
/pom.xml
...
<properties>
...
<jdbc.driver>com.mysql.jdbc.Driver</jdbc.driver>
<jdbc.url>jdbc:mysql://${database.host}/${database.name}</jdbc.url>
<jdbc.user>${database.user}</jdbc.user>
<jdbc.password>${database.password}</jdbc.password>
...
</properties>
...
<profiles>
<profile>
<id>dev</id>
<properties>
...
<database.name>database</database.name>
<database.host>localhost</database.host>
<database.user>root</database.user>
<database.password></database.password>
...
</properties>
</profile>
</profiles>
...
/src/main/resources/database.properties
...
jdbc.driver=${jdbc.driver}
jdbc.url=${jdbc.url}
jdbc.user=${jdbc.user}
jdbc.password=${jdbc.password}
...
/src/main/resources/spring/applicationContext.xml
<beans ... xmlns:p="http://www.springframework.org/schema/p" ...>
...
<bean
id="dataSource"
...
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.user}"
p:password="${jdbc.password}"
... />
...
</beans>
/SRC/тест /java/com/company/project/service/MyItemServiceImplTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/spring/applicationContext.xml" })
public class MyItemServiceImplTest {
@Resource
private MyItemService myItemService;
@Test
public void testSave() {
MyItem myItem = new MyItem();
myItemService.save(myItem);
...
}
}
Вопрос
При выполнении тестов, он бросает исключение:
java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in class path resource [spring/applicationContext.xml]: Could not resolve placeholder 'database.password'
...
Я думаю, это потому, что мне нужно запустить тесты, указав профиль dev
li ke Я делаю, когда запускаю webapp (используя -P dev
). Но я не могу заставить его работать. Возможно ли это?
PS
Файл фильтруется applicationContext.xml (т.е. один в /target/classes/spring/applicationContext.xml) идентична той, в/SRC/*, но отфильтрованные database.properties файл (т.е. /target/classes/database.properties) выглядит
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://${database.host}/${database.name}
jdbc.user=${database.user}
jdbc.password=${database.password}
Это означает, что из файла pom.xml к .properties одного свойства были хорошо фильтруется, но в самой pom.xml , свойства, зависящие от выбранного профиля, не будут фильтроваться. Возможно, потому, что я хочу указать где угодно профиль, который мне нужен при запуске тестов. Но, как я уже говорил, -P dev
не работает с JUnit ...
Как выглядит файл 'applicationContext.xml' после фильтрации? – maba
@maba Как мне обработать, чтобы получить отфильтрованный? – sp00m
Если вы следовали за моим последним [ответом] (http://stackoverflow.com/questions/12579712/initialize-a-constant-for-junit-from-a-properties-file-which-get-itself-initial/12580154# 12580154) Я показал вам, как фильтровать ресурсы. Если вы построите с помощью 'mvn compile', вы пройдете фазу [' process-resources'] (http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference) и в ваша папка 'target/classes /' будет иметь отфильтрованные ресурсы. – maba