2013-12-17 23 views
2

我想在默認的數據庫以外的數據庫上運行單元測試。這裏是我的application.conf如何在Play Framework中聲明第二個數據庫進行測試?

application.secret="[cut]" 
application.langs="en" 

db.default.driver=com.mysql.jdbc.Driver 
db.default.url="jdbc:mysql://localhost:3306/city_game?characterEncoding=UTF-8" 
db.default.user=root 
db.default.password="" 

db.test.driver=com.mysql.jdbc.Driver 
db.test.url="jdbc:mysql://localhost:3306/play_test?characterEncoding=UTF-8" 
db.test.user=root 
db.test.password="" 

ebean.default="models.*" 
ebean.test="models.*" 

logger.root=ERROR 
logger.play=INFO 
logger.application=DEBUG 

BaseModelTest.java:

package models; 

import com.avaje.ebean.Ebean; 
import com.avaje.ebean.EbeanServer; 
import com.avaje.ebean.config.ServerConfig; 
import com.avaje.ebeaninternal.server.ddl.DdlGenerator; 
import com.avaje.ebean.config.dbplatform.MySqlPlatform; 
import com.avaje.ebeaninternal.api.SpiEbeanServer; 
import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import play.test.FakeApplication; 
import play.test.Helpers; 

import java.io.IOException; 

public class BaseModelTest 
{ 
    public static FakeApplication app; 
    public static DdlGenerator ddl; 

    @BeforeClass 
    public static void startApp() throws IOException 
    { 
     app = Helpers.fakeApplication(); 
     Helpers.start(app); 

     String serverName = "test"; 
     EbeanServer server = Ebean.getServer(serverName); 
     ServerConfig config = new ServerConfig(); 
     ddl = new DdlGenerator(); 
     ddl.setup((SpiEbeanServer) server, new MySqlPlatform(), config); 
    } 

    @AfterClass 
    public static void stopApp() 
    { 
     Helpers.stop(app); 
    } 

    @Before 
    public void dropCreateDb() throws IOException 
    { 

     // Drop 
     ddl.runScript(false, ddl.generateDropDdl()); 
     // Create 
     ddl.runScript(false, ddl.generateCreateDdl()); 
    } 
} 

不過,我得到保存在默認數據庫結果,測試一個創造了表,但空。我期望的是將結果寫入測試數據庫,默認值不變。

回答

0

我想你應該你的代碼

分開,因爲這些

@BeforeClass 
    public static void startApp() throws IOException { 

     app = Helpers.fakeApplication(); 
     Helpers.start(app); 
    } 

@Before 
    public void dropCreateDb() throws IOException { 

     String serverName = "test"; 

     EbeanServer server = Ebean.getServer(serverName); 

     ServerConfig config = new ServerConfig(); 

     DdlGenerator ddl = new DdlGenerator((SpiEbeanServer) server, new MySqlPlatform(), config); 

     // Drop 
     ddl.runScript(false, ddl.generateDropDdl()); 

     // Create 
     ddl.runScript(false, ddl.generateCreateDdl()); 
    } 
+0

不,這不會改變任何東西。 – pmichna

1

不知何故,我用不同的方式結束。 我仍然創建了單獨的真實測試數據庫實例(因爲存儲過程),但是我使用了類似Play1的方法。

我有配置面分開我的主要配置(例如測試配置,督促具體的東西,舞臺具體的東西等)

下,如下圖所示我通過Global.scala加載(請注意下面提供的的exaple在工作中發揮Java開發者版本,以及)

object Global extends GlobalSettings { 
    override def onLoadConfig(config: Configuration, path: File, cl: ClassLoader, mode: Mode.Mode): Configuration = { 
    val modeFile: String = s"application.${mode.toString.toLowerCase}.conf" 

    Logger.error(s"Loading {${path.toURI}conf/application.conf}") 
    Logger.error(s"Appending mode specific configuration {${path.toURI}conf/$modeFile}") 
    val modeConfig = config ++ Configuration(ConfigFactory.load(modeFile)) 

    super.onLoadConfig(modeConfig, path, cl, mode) 
    } 
} 

而且application.test.conf配置文件如下:

# test database 
db.default.logStatements=false 
db.default.jndiName=DefaultDS 
db.default.url="jdbc:postgresql://127.0.0.1:5432/db-test" 
db.default.user=user 
db.default.password="[email protected]#$" 
db.default.driver=org.postgresql.Driver 

這樣,我得到以下好處:

  • 我還是寫我的測試通常的方式
  • 玩變陣大幹快上CI /詹金斯測試以及
  • 寫我測試的方式,我可以安全地將它們重新放在現有數據庫實例上,並對數據和用戶基數進行最小限度的假設。這樣我就有90%的把握,我可以用更少的摩擦力來運行這些對抗舞臺/產品環境的遊戲。 (爭議點)
相關問題