2015-12-07 49 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

這解決了我的問題。謝謝雷夫。 –