测试时使用数据源进行Spring Boot

Her*_*arn 10 java spring spring-boot

我正在使用Spring Boot应用程序并启用了自动配置.主应用程序文件标记为@EnableAutoConfiguration.使用java config配置从JNDI查找的数据源,并将创建数据源的类标记为@Configuration.

我有一个测试类如下.

@RunWith( SpringJUnit4ClassRunner.class )
@WebAppConfiguration
@ContextConfiguration( classes = Application.class )
public class TestSomeBusiness {}
Run Code Online (Sandbox Code Playgroud)

问题是,当我运行测试用例时,数据源jndi查找发生,由于测试用例未在服务器环境中运行,因此失败.据我所知,标记的classpath中的类@Configuration被执行,并且是调用数据源查找的原因.

我现在找到的解决方法是使用创建数据源而不是JNDI查找DriverManagerDataSource,这样即使它不是服务器环境,数据源查找也不会失败.

我的问题是:

1)我们如何处理弹簧启动应用程序中的数据源(从JNDI查找时)以进行测试?

2)有没有办法在执行测试用例时排除数据源配置类被调用?

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

Ali*_*ani 9

2)有没有办法在执行测试用例时排除数据源配置类被调用?

您可以将application.properties配置文件添加到您的src/test/resources弹簧启动中,然后在测试环境中选择这些配置.我想,你有application.propertiessrc/main/resources这样的:

spring.datasource.jndi-name=some_jndi
Run Code Online (Sandbox Code Playgroud)

JNDI资源将在您的生产环境中使用.对于您的测试环境,您可以使用MySQL数据库,将这些配置添加到测试中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
Run Code Online (Sandbox Code Playgroud)

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

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

1)我们如何处理弹簧启动应用程序中的数据源(从JNDI查找时)以进行测试?

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

SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind("jndi_name", dataSource);
builder.activate();
Run Code Online (Sandbox Code Playgroud)

当然,另一种选择是Non JNDI在测试环境中使用资源.