gpt4 book ai didi

java - 在 Spring Web 应用程序中运行 JUnit 测试时指定 Maven 配置文件

转载 作者:行者123 更新时间:2023-11-30 04:39:47 26 4
gpt4 key购买 nike

背景

/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 配置文件时运行测试,就像启动 web 应用程序时所做的那样(使用 -P dev)。但我无法让它发挥作用。这可能吗?

PS

过滤后的applicationContext.xml文件(即/target/classes/spring/applicationContext.xml中的文件)与/src/*中的文件相同,但过滤后的database.properties文件(即/target/classes/数据库.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...

最佳答案

资源过滤在 process-resources 中执行阶段。因此,如果您声明mvn test -Pdev,您将已经通过该阶段并且所有过滤都已完成。对于 JUnit 您运行的配置文件并不重要,因为您在该 dev 配置文件中没有做任何其他不同的事情。

关于java - 在 Spring Web 应用程序中运行 JUnit 测试时指定 Maven 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com