Java 测试时使用数据源进行Spring引导

Java 测试时使用数据源进行Spring引导,java,spring,spring-boot,Java,Spring,Spring Boot,我正在使用Spring启动应用程序,并且自动配置已启用。主应用程序文件标记为@EnableAutoConfiguration。数据源是lookedup从JNDI使用java配置,创建数据源的类被标记为@Configuration 我有一个测试类如下 @RunWith( SpringJUnit4ClassRunner.class ) @WebAppConfiguration @ContextConfiguration( classes = Application.class ) public cl

我正在使用Spring启动应用程序,并且自动配置已启用。主应用程序文件标记为
@EnableAutoConfiguration
。数据源是lookedup从JNDI使用java配置,创建数据源的类被标记为
@Configuration

我有一个测试类如下

@RunWith( SpringJUnit4ClassRunner.class )
@WebAppConfiguration
@ContextConfiguration( classes = Application.class )
public class TestSomeBusiness {}
问题是当我运行测试用例时,会发生数据源jndi查找,这会失败,因为测试用例没有在服务器环境中运行。据我所知,classpath中标记为
@Configuration
的类被执行,这就是调用数据源查找的原因

目前我发现的解决方法是使用
drivermanagedatasource
创建数据源,而不是JNDI查找,这样即使不是服务器环境,数据源查找也不会失败

我的问题是:

1) 我们通常如何处理数据库中的数据源(从JNDI中查找时) 用于测试的spring引导应用程序

2) 在执行测试用例时,是否有方法将datasource配置类从调用中排除

3) 我是否应该创建一个嵌入式服务器,以便在执行测试用例时可以进行JNDI查找

2) 在执行测试用例时,是否有方法将datasource配置类从调用中排除

您可以将
application.properties
config文件添加到
src/test/resources
中,spring boot将在测试环境中选择这些配置。我想,您的
src/main/resources
中有
application.properties
,如下所示:

spring.datasource.jndi-name=some_jndi
JNDI
资源将在您的生产环境中使用。对于您的测试环境,您可以使用MySQL数据库,方法是将这些配置添加到您的测试
应用程序中。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
3) 我是否应该创建一个嵌入式服务器,以便可以执行JNDI查找 在执行测试用例时完成

正如我所说的,通过添加特定于测试的配置,您可以完全绕过将
JNDI
用于生产的事实

1) 我们通常如何处理数据源(从 JNDI)在spring引导应用程序中进行测试

您可以使用
org.springframework.mock.JNDI
包中提供的工具来模拟
JNDI
资源。例如,通过使用
simpleNameContextBuilder
可以:

SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind("jndi_name", dataSource);
builder.activate();
当然,另一种选择是在测试环境中使用
非JNDI
资源