在尝试编写一些JBehave BDD测试时遇到以下问题。方案如下: 由于有一条MQ消息,一些特定的记录应保存到我的数据库中,而某些则应从中删除。在我的@When步骤中,我发送给定的消息,而在我的@Then步骤中,我有一些断言来控制结果。 我遇到了Hibernate JPA的persist和update方法的问题,因为它发生在我的代码运行到我的@Then步骤之后,因此我总是得到错误的结果。当我在调试模式下检查它并检查应该更新/删除的每个recorred时,它们都很好。 我认为我的断言应该在将事务提交到数据库之后立即执行-但我所看到的不是这种情况。 有没有办法设置数据库事务之间的延迟或睡眠时间?
例如我在主项目中的删除方法:
public void deleteByAbcId(final String Id) {
getEm().createNamedQuery(TABLE.NAMED_QUERY_DELETE_BY_ABC_ID)
.setParameter(Table.QUERY_PARAM_ABC_ID, Id)
.executeUpdate();
}
在我的BDD项目中,我按如下所示建立数据库连接:
public class DatabaseService implements Closeable {
private EntityManagerFactory emf = null;
private EntityManager em = null;
/**
* This creates an entity manager based on the db connection parameters received in the argument
*/
public DatabaseService(Properties configuration) {
emf = Persistence.createEntityManagerFactory("project-pu", configuration);
em = emf.createEntityManager();
em.getTransaction().begin();
}
/**
* Returns the entity manager for the db connection
*/
public EntityManager getEm() {
return em;
}
在我的断言中,我使用以下查询来检查给定记录是否已成功从数据库中删除:
assertNull(dbHelper.findTableIdBasedOnAbcId(Serenity.sessionVariableCalled(ABC_ID)));
我的dbHelper类如下所示:
public class DbHelper {
private DatabaseService database;
private Configuration config = Configuration.getInstance();
public DbHelper() {
database = new DatabaseService(config.getDbProperties());
}
public String findTableIdBasedOnAbcId(String Id) throws Exception {
String query = "SELECT id FROM TABLE WHERE ABC_ID = ?1";
Query queryResult = database.getEm().createNativeQuery(query);
queryResult.setParameter(1, Id);
List<Long> list = (List<Long>) queryResult.getResultList();
if (!list.isEmpty()) {
return String.valueOf(list.get(0));
}
return null;
}
它总是重新调整数据库的给定记录,而该记录不会被删除。
这是我的主项目的持久性xml:
<persistence-unit name="aaa-pu" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc/aaaa-ds</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.WeblogicJtaPlatform"/>
<property name="hibernate.hbm2ddl.auto" value="none"/>
<property name="hibernate.id.new_generator_mappings" value="false"/>
<property name="tomee.jpa.factory.lazy" value="true"/>
</properties>
</persistence-unit>
这是我的BDD项目之一:
<persistence-unit name="project-pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.connection.autocommit" value="false" />
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.generate_statistics" value="false"/>
</properties>
</persistence-unit>
任何想法,如何设置事务在Hibernate的executeUpdate运行之前不执行assert方法? 我试图调用entityManager.getTransaction.commit方法,然后每次都启动一个新方法,但没有任何更改。 有没有一种方法可以锁定事务,直到executeUpdate完成之后才允许选择查询?还是可以使用JBehave在步骤之间给出等待或睡眠时间?
谢谢。