如标题所示,在内存中使用带有H2的FakeApplication运行Play 2.0.1测试时出现错误。

我设置了一个基本的单元测试:

public class ModelTest {
    @Test
    public void checkThatIndustriesExist() {
        running(fakeApplication(inMemoryDatabase()), new Runnable() {
            public void run() {
                Industry industry = new Industry();
                industry.name = "Some name";
                industry.shortname = "some-name";
                industry.save();
                assertThat(Industry.find.all()).hasSize(1);
            }
        });
    }

产生以下异常:
[info] test.ModelTest
[error] Test test.ModelTest.checkThatIndustriesExist failed: Error getting sequence nextval
[error]     at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:213)
[error]     at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.loadMoreIds(SequenceIdGenerator.java:163)
[error]     at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.nextId(SequenceIdGenerator.java:118)
[error]     at com.avaje.ebeaninternal.server.deploy.BeanDescriptor.nextId(BeanDescriptor.java:1218)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.setIdGenValue(DefaultPersister.java:1304)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:403)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveEnhanced(DefaultPersister.java:345)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:315)
[error]     at com.avaje.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:282)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1577)
[error]     at com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1567)
[error]     at com.avaje.ebean.Ebean.save(Ebean.java:538)
[error]     at play.db.ebean.Model.save(Model.java:76)
[error]     at test.ModelTest$1.run(ModelTest.java:24)
[error]     at play.test.Helpers.running(Helpers.java:277)
[error]     at test.ModelTest.checkThatIndustriesExist(ModelTest.java:21)
[error]     ...
[error] Caused by: org.h2.jdbc.JdbcSQLException: Syntax Fehler in SQL Befehl "SELECT INDUSTRY_SEQ.NEXTVAL UNION[*] SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL "; erwartet "identifier"
[error] Syntax error in SQL statement "SELECT INDUSTRY_SEQ.NEXTVAL UNION[*] SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL UNION SELECT INDUSTRY_SEQ.NEXTVAL "; expected "identifier"; SQL statement:
[error] select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval union select industry_seq.nextval [42001-158]
[error]     at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
[error]     at org.h2.message.DbException.get(DbException.java:169)
[error]     at org.h2.message.DbException.getSyntaxError(DbException.java:194)
[error]     at org.h2.command.Parser.readColumnIdentifier(Parser.java:2777)
[error]     at org.h2.command.Parser.readTermObjectDot(Parser.java:2336)
[error]     at org.h2.command.Parser.readTerm(Parser.java:2453)
[error]     at org.h2.command.Parser.readFactor(Parser.java:2035)
[error]     at org.h2.command.Parser.readSum(Parser.java:2022)
[error]     at org.h2.command.Parser.readConcat(Parser.java:1995)
[error]     at org.h2.command.Parser.readCondition(Parser.java:1860)
[error]     at org.h2.command.Parser.readAnd(Parser.java:1841)
[error]     at org.h2.command.Parser.readExpression(Parser.java:1833)
[error]     at org.h2.command.Parser.parseSelectSimpleSelectPart(Parser.java:1746)
[error]     at org.h2.command.Parser.parseSelectSimple(Parser.java:1778)
[error]     at org.h2.command.Parser.parseSelectSub(Parser.java:1673)
[error]     at org.h2.command.Parser.parseSelectUnion(Parser.java:1518)
[error]     at org.h2.command.Parser.parseSelect(Parser.java:1506)
[error]     at org.h2.command.Parser.parsePrepared(Parser.java:405)
[error]     at org.h2.command.Parser.parse(Parser.java:279)
[error]     at org.h2.command.Parser.parse(Parser.java:251)
[error]     at org.h2.command.Parser.prepareCommand(Parser.java:217)
[error]     at org.h2.engine.Session.prepareLocal(Session.java:415)
[error]     at org.h2.engine.Session.prepareCommand(Session.java:364)
[error]     at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1119)
[error]     at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71)
[error]     at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:267)
[error]     at com.jolbox.bonecp.ConnectionHandle.prepareStatement(ConnectionHandle.java:820)
[error]     at com.avaje.ebean.config.dbplatform.SequenceIdGenerator.getMoreIds(SequenceIdGenerator.java:193)
[error]     ... 80 more

我的模型如下所示:
@Entity
@Table(name = "industry")
public class Industry extends Model {
    @Id public Long id;
    public String name;
    public String shortname;

    // called in the view to trigger lazy-loading
    public String getName() {
        return name;
    }

    public static Finder<Long, Industry> find = new Finder<Long, Industry>(Long.class, Industry.class);
}

...最后是我最初的发展中的相关部分:
create table industry (
    id        bigint not null,
    name      varchar(255),
    shortname varchar(255),
    constraint pk_industry primary key (id)
}

create sequence industry_seq start with 1000;

在我的PostgreSQL数据库上运行一切正常,并且从我的角度来看,该代码与Play2.0 Computer Database Sample没什么不同。

我很乐意提供帮助-谢谢!

问候,
亚历克斯

最佳答案

解决了问题,方法如下:

调用inMemoryDatabase()之前的

  • 我提供了自己的配置
  • 数据库的名称是'test'而不是'default',这是调用inMemoryDatabase()所使用的
  • ,因为我没有在conf/evolutions/test中保留演变,而仅在conf/evolutions/default中保留了未创建架构的过程
  • 我必须清理应用程序,因为在将inMemoryDatabase()更改为
  • 后未应用“默认”配置

    10-06 11:13