问题描述
我正在使用Spring Boot应用程序并启用了自动配置。主应用程序文件标记为 @EnableAutoConfiguration
。从JNDI查找的数据源是使用java config配置的,创建数据源的类标记为 @Configuration
。
我有一个测试类如下。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = Application.class)
public class TestSomeBusiness {}
问题当我运行测试用例时,会发生数据源jndi查找,但由于测试用例未在服务器环境中运行而失败。据我所知,标记为 @Configuration
的类路径中的类被执行,并且是调用数据源查找的原因。
我现在找到的解决方法是使用 DriverManagerDataSource
来代替JNDI查找创建数据源,这样即使它不是服务器环境,数据源查找也会赢得'失败。
我的问题是:
1)我们如何处理数据源(查找时)来自JNDI)在
spring boot应用程序中进行测试?
2)有没有办法在执行测试用例时排除数据源配置类被调用? / p>
3)我应该创建一个嵌入式服务器,以便在执行测试用例时可以完成JNDI查找吗?
正如我所说,你可以通过添加测试特定配置完全绕过你使用 JNDI
进行生产的事实。
You can add a application.properties
config file into your src/test/resources
and spring boot would pick those configurations in test environments. I suppose, you have application.properties
in your src/main/resources
like this:
spring.datasource.jndi-name=some_jndi
This JNDI
resource will be used in your production environment. For your test environment you can use a, say MySQL database, by adding these configurations into your test application.properties
:
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
As i said, you can totally bypass the fact that you're using JNDI
for production by adding test specific configurations.
You can mock JNDI
resources using facilities available in org.springframework.mock.jndi
package. For example by using SimpleNamingContextBuilder
you can:
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind("jndi_name", dataSource);
builder.activate();
The other option is, of course, using Non JNDI
resources in test environments.
这篇关于测试时使用数据源进行Spring Boot的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!