SpringBoot测试:如何用管理员执行@Sql、应用用户运行程序?
以下是你可能漏掉的关键配置步骤,按优先级排查:
给双数据源加唯一标识并指定主数据源
必须给两个数据源分别添加@Qualifier标记唯一名称,同时把应用要用的userAppDataSource设为@Primary,否则Spring会随机选择默认数据源,导致应用连接错误的用户。代码示例:@Bean @Primary @Qualifier("userAppDataSource") public DataSource userAppDataSource() { return DataSourceBuilder.create() .url("jdbc:oracle:thin:@//your-host:1521/your-service") .username("user_app") .password("your-app-pwd") .driverClassName("oracle.jdbc.OracleDriver") .build(); } @Bean @Qualifier("userOwnerDataSource") public DataSource userOwnerDataSource() { return DataSourceBuilder.create() .url("jdbc:oracle:thin:@//your-host:1521/your-service") .username("user") .password("your-owner-pwd") .driverClassName("oracle.jdbc.OracleDriver") .build(); }@SqlConfig的数据源名称要完全匹配
使用@SqlConfig(dataSource = "xxx")时,字符串必须和@Qualifier的标识完全一致,大小写敏感。比如你定义的是userOwnerDataSource,就不能写成userOwnerDS。示例:@Test @Sql(scripts = "/init-test-data.sql", config = @SqlConfig(dataSource = "userOwnerDataSource")) void testBusinessLogic() { // 测试逻辑:应用用user_app连接数据库,SQL脚本用user用户执行 }检查数据源连接参数与数据库权限
别忽略最基础的验证:两个数据源的URL、用户名、密码是否对应正确?Oracle的JDBC URL格式是否正确(注意区分SID和service name)?测试环境的数据库是否允许这两个用户从测试机器访问?user用户有没有执行脚本的权限,user_app有没有连接数据库的权限?配置对应事务管理器(如果涉及事务)
如果测试用到事务,必须给每个数据源配置单独的事务管理器,否则会出现事务绑定错误进而引发连接失败。示例:@Bean public PlatformTransactionManager userAppTxManager(@Qualifier("userAppDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public PlatformTransactionManager userOwnerTxManager(@Qualifier("userOwnerDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }要是SQL脚本需要事务控制,也可以在
@SqlConfig里指定对应的事务管理器:@SqlConfig(dataSource = "userOwnerDataSource", transactionManager = "userOwnerTxManager")排除Spring Boot自动配置的默认数据源
用Spring Boot的话,得禁用自动配置的默认数据源,避免和你手动配置的数据源冲突。可以在测试类上加:@SpringBootTest(exclude = DataSourceAutoConfiguration.class)或者在
application-test.properties里添加:spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
内容的提问来源于stack exchange,提问作者Joaquín Aramendía

