我经常使用内存中的HSQL数据库作为测试数据库来编写数据库相关代码的单元测试。最近,我决定从1.8.1.3升级到2.2.9,以利用在2.x版本分支中添加的ROW_NUMBER()支持。
似乎在某种程度上,新版本比旧版本更严格。使用Hibernate(3.6.10)作为ORM,例如,我可能创建一个Configuration
对象来创建first
SessionFactory
,然后使用该对象来填充测试数据,然后将Configuration
to
对象用于被测试的类,这将创建它自己SessionFactory
进行选择。使用hsqldb
1.8.1.3,没问题。对于2.2.9,select块位于hsqldb代码内部。以下是SSCCE对此进行说明:
public void testTwoSessionFactories() throws Exception {
boolean withTx = false;
AnnotationConfiguration config = new AnnotationConfiguration().addAnnotatedClass(Entity.class);
config.setProperty("hibernate.hbm2ddl.auto", "create");
config.setProperty(Environment.DIALECT, HSQLDialect.class.getName());
config.setProperty(Environment.DRIVER, jdbcDriver.class.getName());
config.setProperty(Environment.URL, "jdbc:hsqldb:mem:testDB");
config.setProperty(Environment.USER, "SA");
config.setProperty(Environment.PASS, "");
SessionFactory sessionFactory1 = config.buildSessionFactory();
Session session = sessionFactory1.openSession();
Transaction tx = null;
if (withTx)
tx = session.beginTransaction();
session.save(new Entity("one"));
if (withTx)
tx.commit();
session.flush();
session.close();
config.setProperty("hibernate.hbm2ddl.auto", "");
SessionFactory sessionFactory2 = config.buildSessionFactory();
Session session2 = sessionFactory2.openSession();
List entities = session2.createCriteria(Entity.class).list();
session2.close();
}
注意withTx
布尔值。使用HSQLDB 1.8.1.3,我可以使用withTx
true或false 运行此代码,这会很好。对于HSQLDB
2.2.9,withTx
必须将其设置为true ,否则线程将在.list()
调用时被阻塞,并具有以下堆栈:
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: not available
CountDownLatch$Sync(AbstractQueuedSynchronizer).parkAndCheckInterrupt() line: not available
CountDownLatch$Sync(AbstractQueuedSynchronizer).doAcquireSharedInterruptibly(int) line: not available
CountDownLatch$Sync(AbstractQueuedSynchronizer).acquireSharedInterruptibly(int) line: not available
CountDownLatch.await() line: not available
CountUpDownLatch.await() line: not available
Session.executeCompiledStatement(Statement, Object[]) line: not available
Session.execute(Result) line: not available
JDBCPreparedStatement.fetchResult() line: not available
JDBCPreparedStatement.executeQuery() line: not available
BatchingBatcher(AbstractBatcher).getResultSet(PreparedStatement) line: 208
CriteriaLoader(Loader).getResultSet(PreparedStatement, boolean, boolean, RowSelection, SessionImplementor) line: 1953
CriteriaLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean) line: 802
CriteriaLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, boolean) line: 274
CriteriaLoader(Loader).doList(SessionImplementor, QueryParameters) line: 2542
CriteriaLoader(Loader).listIgnoreQueryCache(SessionImplementor, QueryParameters) line: 2276
CriteriaLoader(Loader).list(SessionImplementor, QueryParameters, Set, Type[]) line: 2271
CriteriaLoader.list(SessionImplementor) line: 119
SessionImpl.list(CriteriaImpl) line: 1716
CriteriaImpl.list() line: 347
EntityTest.testTwoSessionFactories() line: 46
HSQLDB在1.8.1.3和2.2.9之间进行了哪些更改,需要此代码在事务中进行保存,我可以将其关闭吗?
HSQLDB 1.8.x
使用READ UNCOMMITTED
对已被其他事务添加或更改的行。
HSQLDB 2.x
使用READ COMMITTED
(默认情况下)或SERIALIZABLE
隔离级别。因此,事务必须在其更改可见之前提交。还有transaction model
要考虑的。
缺省值transaction model
是LOCKS
锁定被修改的表,直到提交事务为止。您可以使用MVCC model
代替,它允许其他会话从表中读取并修改未修改的行。您可以将此模型与一起使用URL property
。
config.setProperty(Environment.URL, "jdbc:hsqldb:mem:testDB;hsqldb.tx=mvcc");
问题内容: 我在尝试在Angularjs中测试基于承诺的代码时遇到了困难。 我的控制器中有以下代码: 我想对以下情况进行单元测试: 什么时候被调用 当是做了应该改变的位置(调用) 在我看来,没有简单的方法可以分别测试这两种情况。 我要做的第一个测试是: 现在,要测试第二种情况,我需要创建另一个永远不变的虚假承诺。这一切都非常乏味,并且有很多样板代码。 还有其他测试方法吗?还是我的设计有异味? 问题
概况 背景 当我们在写一些UI测试的时候,我们总需要到浏览器去看一下一些DOM的变化。比如,我们点击了某个下拉菜单,会有另外一个联动的下拉菜单发生了变化。而如果这个事件更复杂的时候,有时我们可能就很难观察出来他们之间的变化。 ShowCase Luffa Screenshot 源码见:https://github.com/phodal/luffa 基本原理 尽管这里的例子是以Jasmine作为例子
我的spark应用程序中有一个方法从MySQL数据库加载数据。该方法看起来如下所示。 该方法除了执行方法并从数据库加载数据外,其他什么都不做。我该如何测试这种方法呢?标准方法是创建对象的模拟,该对象是的实例。但是由于有一个私有构造函数,所以我无法使用Scalamock来模拟它。 这里的主要问题是,我的函数是一个纯粹的副作用函数(副作用是从关系数据库拉数据),如果我在嘲笑时遇到问题,我如何单元测试这
我有一个应用程序,使用经典的Spring配置与xml,它可以使用Spring启动仅用于单元测试? 像这样:
但是有没有一种方法可以用我的SQL存储库做同样的事情,并让EntityManger对测试数据库执行nativeQuery呢? 我还没弄明白。
我有一个方法如下。 我想为下面的方法写两个测试用例。 1) 提交数据的成功事务 2) 具有回滚数据的失败事务 我如何写一个涉及事务的测试用例,并成功和失败?