2012-03-15 31 views
2

發揮框架:1.2.3如何清除/刪除數據庫含量研究(功能)測試中playframework

嗨,

我試圖通過劇中的夾具來清除我的數據庫。但是,我遇到了一些問題。

首先,Fixtures.deleteDatabase()刪除整個數據庫和玩不重新創建它在另一個測試(也我還沒有發現任何這樣做的。

其次,試圖deleteAllModules()我得到一個。例外的任何樣板戲試圖刪除:

java.sql.SQLException: Lock wait timeout exceeded; try restarting 

這些模型使用正常Model.save()在測試過程中已經創建我假設 - 再一次 - 交易進入我的路不知何故不過,。看着數據庫,所有的型號都會持續存在。

@After 
public void tearDown() throws InterruptedException, ExecutionException { 
    new Job() { 
     @Override 
     public void doJob() throws Exception { 
      Logger.debug("[SetupUtils.createClearDBJob().new Job() {...}] Deleting database"); 
      Fixtures.deleteAllModels(); 
      //    Fixtures.delete() 
      //    Fixtures.deleteDatabase(); 
     } 
    }.now().get(); 
} 

全堆棧跟蹤

ERROR 563 :play#niceThrowable - While deleting class models.DropboxFolder instances 
    javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute update query 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1224) 
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:108) 
    at play.db.jpa.JPAPlugin$JPAModelLoader.deleteAll(JPAPlugin.java:478) 
    at play.test.Fixtures.delete(Fixtures.java:72) 
    at play.test.Fixtures.delete(Fixtures.java:92) 
    at play.test.Fixtures.deleteAllModels(Fixtures.java:104) 
    at mashpan.utilities.SetupUtils$2.doJob(SetupUtils.java:44) 
    at play.jobs.Job.doJobWithResult(Job.java:50) 
    at play.jobs.Job.call(Job.java:146) 
    at play.jobs.Job$1.call(Job.java:66) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:165) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:679) 
Caused by: org.hibernate.exception.GenericJDBCException: could not execute update query 
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:110) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:421) 
    at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:283) 
    at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1288) 
    at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117) 
    at org.hibernate.ejb.QueryImpl.internalExecuteUpdate(QueryImpl.java:188) 
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:99) 
    ... 15 more 
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310) 
    at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:101) 
    ... 21 more 
ERROR 563 :play#niceThrowable - While deleting class models.User instances 
    javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute update query 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1224) 
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:108) 
    at play.db.jpa.JPAPlugin$JPAModelLoader.deleteAll(JPAPlugin.java:478) 
    at play.test.Fixtures.delete(Fixtures.java:72) 
    at play.test.Fixtures.delete(Fixtures.java:92) 
    at play.test.Fixtures.deleteAllModels(Fixtures.java:104) 
    at mashpan.utilities.SetupUtils$2.doJob(SetupUtils.java:44) 
    at play.jobs.Job.doJobWithResult(Job.java:50) 
    at play.jobs.Job.call(Job.java:146) 
    at play.jobs.Job$1.call(Job.java:66) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at 


java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:165) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:679) 
Caused by: org.hibernate.exception.GenericJDBCException: could not execute update query 
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:110) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.executeUpdate(QueryTranslatorImpl.java:421) 
    at org.hibernate.engine.query.HQLQueryPlan.performExecuteUpdate(HQLQueryPlan.java:283) 
    at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1288) 
    at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117) 
    at org.hibernate.ejb.QueryImpl.internalExecuteUpdate(QueryImpl.java:188) 
    at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:99) 
    ... 15 more 
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310) 
    at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:101) 
    ... 21 more 
+0

究竟是什麼問題,你必須先刪除數據庫,刪除數據庫中的所有內容,並在例如使用Fixtures.loadModels創建數據之後:你還需要什麼? – 2012-03-15 16:12:06

+0

Fixtures.deleteDatabase()刪除整個數據庫,play在下一次測試中不會重新創建它,因此加載模型也失敗。所以我不能那樣做。 我正在尋找一種方法來刪除所有表中的所有行,但沒有別的。另一種方法是刪除所有表,甚至刪除整個數據庫,然後讓它重新創建。然而,沒有找到辦法做到這一點 – forste 2012-03-19 13:35:54

回答

1

你可以嘗試設置創建/自舉刪除operaton,並檢查播放!正在測試模式或生產模式下運行。

@OnApplicationStart 
public class Bootstrap extends Job { 

    public void doJob() { 
    if (Play.mode == Play.Mode.DEV) { 
     DropboxFolder.deleteAll(); // delete 
     Fixtures.load("samples_data.yml"); // recreate 
    } 
    } 
} 
相關問題