Playframework 2.4 evolution在调试器中失败

时间:2015-12-07 11:54:21

标签: playframework-2.4 intellij-15

我有一个非常正常的playframework项目,它实现了许多休息服务。 '激活剂测试'从命令行运行良好。当我尝试在IntelliJ 15中的调试器中运行其中一个测试时,我的一个数据库演变脚本失败了:

12:34:29.031 [main] ERROR play.api.db.evolutions.DefaultEvolutionsApi - Table "TOKEN" not found;SQL statement:
alter table "TOKEN" rename to "POS_TOKEN" [42102-187] [ERROR:42102, SQLSTATE:42S02]

我的h2 / 2.sql看起来像这样:

# --- !Ups
alter table "TOKEN" rename to "POS_TOKEN";

drop sequence "TOKEN_SEQ" ;
create sequence "POS_TOKEN_SEQ";

# --- !Downs
alter table "POS_TOKEN" rename to "TOKEN";

drop sequence "POS_TOKEN_SEQ" ;
create sequence "TOKEN_SEQ";

h2 / 1.sql的相关定义是

create table token (
  id                        bigint not null,
  access_token              varchar(255) not null
  constraint pk_token primary key (id))
;

只有在调试器中运行时,此演变才会失败。 使用'激活器运行'启动应用程序时演变步骤2执行没有错误,表格被正确重命名。我已经使用h2浏览器验证了这一点。

我正在使用IntelliJ 15旗舰版。调试配置为Class#methodName, VM-arg is -ea, Working dir = $MODULE_DIR$

我与dabase交互的单元测试都扩展了InMemoryDbTest:

public abstract class InMemoryDbTest {

  protected final String fakeUser  = "FakeUser";

  public FakeApplication app;


  @Before
  public void before() {
    Map<String, String> inMemoryDatabase = Helpers.inMemoryDatabase("h2");
    app = Helpers.fakeApplication(inMemoryDatabase);
    Helpers.start(app);
  }

  @After
  public void after() {
    Helpers.stop(app);
  }
}

我很难过。任何有关解决此问题的帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

这个问题的关键是IntelliJ中的测试运行器已设置为使用工作dir = $ MODULE_DIR $,在我的设置中等于$ PROJECT_HOME / .idea / modules。

FakeApplication尝试在$ MODULE_DIR / conf / evolutions / h2 / 1.sql中找到evolutions-script,但在那里找不到它,并根据最新版本的模型继续自动生成它。稍后,它运行针对数据库的演进。首先,它找到新生成的1.sql并应用它,然后它尝试运行手动创建的2.sql和后续步骤。这些失败,因为最初的1.sql不是$ APP / conf / evolutions / h2 / 1.sql中的1.sql,而是自动生成的$ MODULE_DIR $ / conf / evolutions / h2 / 1.sql。

将测试的运行配置中的Working Dir设置为空字符串解决了问题。