2015-12-07 110 views
0

我有一个非常正常的playframework项目,实现了一些休息服务。 '激活测试'从命令行运行良好。当我尝试运行在15的IntelliJ调试器中的一个测试,我的数据库进化脚本的一个失败:Playframework 2.4进化失败调试器

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 Ultimate Edition。调试配置是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); 
    } 
} 

我难倒。感谢解决这个问题的任何帮助。

回答

2

此问题的关键在于IntelliJ中的测试运行器已设置为使用工作目录= $ MODULE_DIR $,在我的设置中该目录等同于$ PROJECT_HOME/.idea/modules。

FakeApplication试图查找变阵脚本在$ MODULE_DIR/conf目录/变阵/ H2/1.SQL,犯规找到它,并进行基于模型的最新版本自动生成它。稍后,它会对数据库进行演变。首先,它找到新自动生成的1.sql并应用它,然后尝试运行手动创建的2.sql和后续步骤。这些失败了,因为最初的1.sql不是$ APP/conf/evolutions/h2/1.sql中的1.sql,而是自动生成的$ MODULE_DIR $/conf/evolutions/h2/1.sql。

将运行配置中的工作目录设置为空字符串可以解决问题。

+0

这解决了我的问题。谢谢雷夫。 –