Grails 2.4.4多个数据源,单独的驱动程序,IntegrationSpec

时间:2015-02-06 00:14:16

标签: sql-server grails datasource integration-testing

我试图在Grails 2.4.4项目中使用多个数据源。根据文档,这应该是可能的:

http://www.grails.org/doc/2.4.4/guide/conf.html#multipleDatasources

我的主要数据源(我想用于所有域类的那个)正在使用H2,正如默认的DataSource.groovy配置所配置的那样。我的第二个只读数据源是SQL Server,我尝试在我的DataSource.groovy配置的顶层声明如下(由所有环境共享):

ds {
    pooled = true
    dialect = "org.hibernate.dialect.SQLServer2008Dialect"
    driverClassName = "net.sourceforge.jtds.jdbc.Driver"
    url = "jdbc:jtds:sqlserver://myserver:1433/mydb;domain=mydomain;useNTLMv2=true;user=myuser"
    dbCreate = "none"
}

(不要让URL让你失望 - 我只需要使用Windows身份验证和JTDS。我已经通过第三方客户端对此进行了测试。)

我将此注入我的服务类并使用它,所有内容似乎都很好用:

def dataSource_ds

def serviceMethod(){
    Sql ds = new Sql(dataSource_ds)
    String query = "SELECT ... "
    def results = ds.rows(query)
    println "Results are ${results.size()}"
    return "Some value"
}

但是当我尝试从IntegrationSpec支持的集成测试中访问它时,我注意到我发现"架构未找到"我的查询字符串引用的有效模式的错误,例如" dbo"。此设置中的任何错误的堆栈跟踪如下所示:

org.h2.jdbc.JdbcSQLException :架构" DBO"未找到; SQL语句: ...     at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)     at org.h2.message.DbException.get(DbException.java:169)     在org.h2.message.DbException.get(DbException.java:146)     在org.h2.command.Parser.readTableOrView(Parser.java:4774)     在org.h2.command.Parser.readTableFilter(Parser.java:1083)     在org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1689)     在org.h2.command.Parser.parseSelectSimple(Parser.java:1796)     在org.h2.command.Parser.parseSelectSub(Parser.java:1683)     在org.h2.command.Parser.parseSelectUnion(Parser.java:1526)     在org.h2.command.Parser.parseSelect(Parser.java:1514)     在org.h2.command.Parser.parsePrepared(Parser.java:404)     在org.h2.command.Parser.parse(Parser.java:278)     在org.h2.command.Parser.parse(Parser.java:250)     在org.h2.command.Parser.prepareCommand(Parser.java:217)     在org.h2.engine.Session.prepareLocal(Session.java:414)     在org.h2.engine.Session.prepareCommand(Session.java:363) ...

现在为什么这个数据源会尝试使用H2驱动程序?

如果相关,我的集成测试如下:

void "serviceMethod" () {
    when: "service method is called"
    String response = myService.serviceMethod()
    then: "we should get the appropriate text back"
    response.equals("Some value")
}

如果在Service类中,我使用Groovy Sql对象的构造函数对连接进行硬编码,则集成测试工作正常,任何堆栈跟踪都通过JTDS驱动程序。但是当我尝试使用注入的数据源时事情很奇怪。

知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

只是关闭这个循环,并希望将来在这种疏忽中拯救某些人的痛苦:

Grails在运行测试时使用内存数据库。请务必阅读集成测试和生产之间的其他差异: http://www.grails.org/doc/latest/guide/testing.html#integrationTesting

此功能使得在任何测试期间使用外部(只读)数据源非常有趣,但其中一些是可以预期的(从长远来看,依赖于外部数据源的测试不是一个非常好的测试) 。我希望在某些时候重构我的应用程序及其测试方法(例如,在测试期间使用简单的DAO和模拟),因为我并不真正关心从应用程序的测试中断言外部数据源的内容。 / p>