2012-09-25 2 views
1

фонУказание профиля 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 ...

+0

Как выглядит файл 'applicationContext.xml' после фильтрации? – maba

+0

@maba Как мне обработать, чтобы получить отфильтрованный? – sp00m

+1

Если вы следовали за моим последним [ответом] (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

ответ

2

Фильтр ресурсов выполняется в фазе process-resources. Поэтому, если вы укажете mvn test -Pdev, вы пройдете эту фазу, и вся фильтрация будет выполнена. Для JUnit не имеет значения, какой профиль вы используете, поскольку в этом dev профиле вы ничего не делаете по-другому.

Смежные вопросы