内存中的 hsqldb 和目标 junit 测试
Posted
技术标签:
【中文标题】内存中的 hsqldb 和目标 junit 测试【英文标题】:hsqldb inmemory ant target junit test 【发布时间】:2013-05-06 16:04:11 【问题描述】:我已经定义了一个包含内存中 HSQLDB 的 Ant 目标:
<target name="create.tables" depends="-prepare.test">
<property name="db.connection.url" value="jdbc:hsqldb:mem:adb"/>
<property name="db.driver" value="org.hsqldb.jdbcDriver"/>
<property name="db.username" value="a"/>
<property name="db.password" value="a"/>
<echo>Creating tables using: $db.driver $db.connection.url $product.mysql-connector.jar</echo>
<sql driver="$db.driver"
url="$db.connection.url"
userid="$db.username"
password="$db.password"
onerror="stop"
src="/create-schema.sql">
<classpath refid="test.classpath" />
</sql>
</target>
prepare.test 仅包含文件集等基本内容。 当我打印 SQL 插入时,一切正常。但是如何从 JUnit 测试用例访问内存中的 HSQLDB?
我试过了:
Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:mem:adb",
"a", "a");
但只有一个空数据库。是否可以在 JUnit 测试用例中将 HSQLDB 与来自 Ant 目标的插入语句一起使用?
junit 测试中的异常如下。表存在是因为它是在ant任务中创建的:
[junit] java.lang.Exception: user lacks privilege or object not found: MYTABLE
[junit] at com.inmemorytests.InMemoryTest.testSomething(InMemoryTest.java:116)
[junit] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[junit] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[junit] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[junit] at java.lang.reflect.Method.invoke(Method.java:601)
[junit] at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
[junit] at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
[junit] at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
[junit] at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
[junit] at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
[junit] at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
[junit] at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
[junit] at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
[junit] at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
[junit] at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
[junit] at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
[junit] at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
[junit] at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
[junit] at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:518)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1052)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:906)
【问题讨论】:
【参考方案1】:这是您在 Ant 中的连接 URL:
<property name="db.connection.url" value="jdbc:hsqldb:mem:adb"/>
您必须使用相同的 URL 以及相同的用户名和密码进行连接:
connection = DriverManager.getConnection("jdbc:hsqldb:mem:adb", "a", "a");
更新:使用内存数据库时,Ant 目标和 JUnit 测试必须在同一个 JVM 中运行。如果您在不同的 JVM 中运行这两者,请在测试之前启动 HSQLDB 服务器并从每个测试连接到该服务器。服务器连接 URL 不同,并在 HSQLDB 指南中进行了描述。
【讨论】:
感谢您的回答,我现在使用正确的凭据进行了尝试。但它仍然无法正常工作。在 jUnit 测试中,我将异常添加到问题中 再次感谢。现在它起作用了。我像 fredt 所说的那样配置它并使用 config.properties(我们的标准配置)来使用 jdbc:hsqldb:mem:adb 作为连接 URL以上是关于内存中的 hsqldb 和目标 junit 测试的主要内容,如果未能解决你的问题,请参考以下文章
HSQLDB + JUnit + Hibernate:java.sql.SQLException:无效的模式名称
HSQLDB Junit 测试对 DB2 和 SQL Server NOLOCK 查询失败
对于测试套件,用内存中的 HSQLDB 替换 MYSQL 不起作用
Junit 测试用例 - HSQLDB count(...) over (partition ... order by ...)