hibernate - 使用 TestNg 测试 hibernate ,单独运行时测试通过但在套件中失败

标签 hibernate testing testng

我正在使用在 IntelliJ 下运行的 TestNg 测试 hibernate 。 我在套件中有两个测试,当套件运行时,其中一个失败。当我单独运行它们时,它们会成功。 此外,当我单击“仅运行失败”时,我会变成绿色。

我想在这种情况下,测试的主体并不重要,但我还是在这里展示它。堆栈跟踪如下。

我尝试将 singleThreaded 参数添加到测试套件,但这没有帮助。我还添加了 AfterMethod,我认为它应该有所帮助,但结果是一样的。 知道发生了什么事吗?

@Test(singleThreaded = true)
public class RatesPersistanceTest
{
private SessionFactory sessionFactory;

@BeforeMethod
private void before() throws Exception
{
    sessionFactory = new Configuration().configure().buildSessionFactory();
}

@AfterMethod
private void after() throws Exception
{
    sessionFactory.close();
}

@Test
public void should_save_rates_and_retrieve_them_with_success()
{
    Money standardPrice = Money.parse("USD 85");
    Money upchargeExtraPerson = Money.parse("USD 80");
    Money upchargeExtraBed = Money.parse("USD 75");
    Room room = getMeRoom();

    AvailabilityPeriod availabilityPeriod = new AvailabilityPeriod(DateTime.now(), DateTime.now().plusDays(5), true);
    Season season = new BasicSeason("season name", availabilityPeriod);
    Rate seasonRate = new SeasonRate(standardPrice, upchargeExtraPerson, upchargeExtraBed, room, season);

    Session session = sessionFactory.openSession();
    session.beginTransaction();

    session.save(room);

    session.save(season);

    session.save(seasonRate);

    session.getTransaction().commit();
    session.close();
}

@Test(expectedExceptions = org.hibernate.exception.ConstraintViolationException.class)
public void season_rate_should_violate_db_constraints_when_saved_without_season()
{
    Money standardPrice = Money.parse("USD 85");
    Money upchargeExtraPerson = Money.parse("USD 80");
    Money upchargeExtraBed = Money.parse("USD 75");
    Room room = getMeRoom();

    AvailabilityPeriod availabilityPeriod = new AvailabilityPeriod(DateTime.now(), DateTime.now().plusDays(5), true);
    Season season = new BasicSeason("season name", availabilityPeriod);
    Rate seasonRate = new SeasonRate(standardPrice, upchargeExtraPerson, upchargeExtraBed, room, null);

    Session session = sessionFactory.openSession();
    session.beginTransaction();

    session.save(room);

    session.save(season);

    session.save(seasonRate);

    session.getTransaction().commit();
    session.close();
}


private Room getMeRoom()
{
    final RoomName roomName = new RoomName("101");
    final RoomType roomType = new RoomType("cheap");
    final Money standardPrice = Money.parse("USD 100");
    final Money upchargeExtraPerson = Money.parse("USD 50");
    final Money upchargeExtraBed = Money.parse("USD 20");
    final RackRate rackRate = new RackRate(standardPrice, upchargeExtraPerson, upchargeExtraBed, null);
    final int maxExtraBeds = 2;
    final Occupancy occupancy = new Occupancy(4, 2);
    return new Room("C", roomName, roomType, rackRate, HousekeepingStatus.CLEAN, RoomAvailability.AVAILABLE, maxExtraBeds, occupancy);
}

}

堆栈跟踪简短版本:

org.hibernate.PessimisticLockException: Timeout trying to lock table "ROOMS"; SQL   statement:
insert into ROOMS
...
Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "ROOMS"; SQL  statement:
insert into ROOMS

hibernate 配置:

 <property name="connection.url">jdbc:h2:mem:db1;DB_CLOSE_DELAY=0</property>
 <property name="hbm2ddl.auto">create-drop</property>

堆栈跟踪:

org.hibernate.PessimisticLockException: Timeout trying to lock table "ROOMS"; SQL   statement:
insert into ROOMS (prefix, housekeepingStatus, availability, typeName, maxExtraBeds,   standardPrice, upchargeExtraPerson, upchargeExtraBed, standard, maximum, name) values  (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [50200-168]
    at org.hibernate.dialect.H2Dialect$2.convert(H2Dialect.java:317)
     at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at $Proxy9.executeUpdate(Unknown Source)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2962)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3403)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1210)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:399)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at net.mklew.hotelms.persistance.RatesPersistanceTest.should_save_rates_and_retrieve_them_with_success(RatesPersistanceTest.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:673)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:842)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1166)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.runWorkers(TestRunner.java:1178)
at org.testng.TestRunner.privateRun(TestRunner.java:757)
at org.testng.TestRunner.run(TestRunner.java:608)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1158)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1083)
at org.testng.TestNG.run(TestNG.java:999)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:203)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:174)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:111)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "ROOMS"; SQL  statement:
insert into ROOMS (prefix, housekeepingStatus, availability, typeName, maxExtraBeds, standardPrice, upchargeExtraPerson, upchargeExtraBed, standard, maximum, name) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [50200-168]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:169)
at org.h2.message.DbException.get(DbException.java:146)
at org.h2.table.RegularTable.doLock(RegularTable.java:500)
at org.h2.table.RegularTable.lock(RegularTable.java:434)
at org.h2.command.dml.Insert.insertRows(Insert.java:123)
at org.h2.command.dml.Insert.update(Insert.java:84)
at org.h2.command.CommandContainer.update(CommandContainer.java:75)
at org.h2.command.Command.executeUpdate(Command.java:230)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
... 47 more

最佳答案

我回到那个项目,问题也回来了。

解决方法如下:

将@BeforeMethod 和@AfterMethod 更改为@BeforeSuite 和@AfterSuite

这也意味着在一个测试中插入的数据将在另一个测试中可见,至少我认为如果我在测试之间不 hibernate 就是这种情况,但这至少有效,所以我可以处理它。

关于hibernate - 使用 TestNg 测试 hibernate ,单独运行时测试通过但在套件中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312845/

相关文章:

java - 在 jpql 查询中创建和填充 pojos 并作为列表获取

java - 从 JSF 访问 JPA 元组属性

java - hibernate只读查询缓存机制

perl - 规划 perl 测试中的死亡

ruby-on-rails - Rails 单元测试协会

character-encoding - AssertionError 的 IDEA 输出中的字符编码

java - 如何自定义 testNG 结果控制台输出以提供更多信息(例如 url 测试报告)?

java - "TestNG No tests found. Nothing was run"通过 TestNG 使用 Selenium 执行自动化测试

java - 尝试使用 Spring 以正确的顺序销毁 bean

spring - 如何在 Spring Data 存储库上测试 Spring 的声明式缓存支持?