0

我有一个非常普通的 playframework 项目,它实现了许多休息服务。'activator test' 从命令行运行良好。当我尝试在 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))
;

这种演变只有在调试器中运行时才会失败。 当使用 'activator run' 启动应用程序时,进化步骤 2 将正确执行,并且表已正确重命名。我已经使用 h2 浏览器验证了这一点。

我正在使用 IntelliJ 15 终极版。调试配置是Class#methodName, VM-arg is -ea, Working dir = $MODULE_DIR$.

我与数据库交互的单元测试都扩展了 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);
  }
}

我难住了。感谢您提供解决此问题的任何帮助。

4

1 回答 1

2

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

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

在测试的运行配置中将工作目录设置为空字符串解决了这个问题。

于 2015-12-15T09:05:17.617 回答