Grails4配置多数据源后单元测试报Invalid connection [ALL]错误如何解决
问题原因
Grails 4中DataTest trait默认使用单数据源的SimpleMapDatastore内存模拟实现来测试GORM逻辑,它默认只会初始化默认数据源的模拟实例,无法识别你在域类Role中配置的datasource ConnectionSource.ALL,也不知道你配置的第二个readReplica数据源,所以报找不到ALL连接的错误。
解决方案
方案1:纯单元测试场景(无需真实数据库,仅测试域类本身逻辑)
如果你不需要测试多数据源的同步读写逻辑,仅测试域类的约束、自定义方法等,可在mock域类前临时覆盖域类的数据源配置,仅使用默认数据源测试:
class RoleSpec extends Specification implements DataTest { void setupSpec() { // 临时修改Role的数据源配置,单元测试仅使用默认数据源 Role.mapping.datasource = 'DEFAULT' mockDomain Role } void "test nothing"() { expect: true } }
如果你需要在单元测试中模拟多数据源,可显式初始化包含所有数据源的SimpleMapDatastore:
import org.grails.datastore.mapping.simple.SimpleMapDatastore import org.grails.datastore.mapping.model.DefaultMappingContext class RoleSpec extends Specification implements DataTest { void setupSpec() { // 初始化包含所有配置数据源的模拟实例 SimpleMapDatastore datastore = new SimpleMapDatastore( new DefaultMappingContext(), ['DEFAULT', 'readReplica'] as Set ) mockDomains(datastore, Role) } void "test nothing"() { expect: true } }
方案2:集成测试场景(需真实测试多数据源逻辑)
如果你需要测试多数据源下的真实读写、同步逻辑,建议改用集成测试,启动完整Spring上下文加载你配置的test环境多数据源:
import grails.testing.mixin.integration.Integration import grails.gorm.transactions.Transactional @Integration class RoleSpec extends Specification { @Transactional void "test nothing"() { expect: true } }
此场景无需手动mock域类,框架会自动加载所有域类和多数据源配置,完美支持ConnectionSource.ALL的配置。
内容的提问来源于stack exchange,提问作者SGT Grumpy Pants
相关产品推荐
相关产品推荐

