1

バックグラウンド

/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 / test /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これは、Webアプリを起動するときと同じように(を使用して)プロファイルを指定しながらテストを実行する必要があるためだと思い-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では動作しないようです...

4

1 に答える 1

3

リソースのフィルタリングはprocess-resourcesフェーズで実行されます。したがって、あなたmvn test -Pdevがそのフェーズを通過し、すべてのフィルタリングが完了したと述べた場合。そのプロファイルでは他に何もしていないので、実行しているプロファイルは JUnit にとって重要ではありませんdev

于 2012-09-25T13:14:46.067 に答える