java - 如何在 Play Framework 中声明第二个数据库进行测试?

标签 java unit-testing playframework ebean playframework-2.2

我想在默认数据库以外的数据库上运行单元测试。这是我的 application.conf:

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

基础模型测试.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());
    }
}

但是,我得到的结果保存在默认数据库中,而测试数据库的表已创建但为空。我期望的是将结果写入测试数据库,并保持默认值不变。

最佳答案

我以某种方式结束了不同的方法。 我仍然创建了单独的真实测试数据库实例(因为存储过程),但我使用了类似 Play1 的方法。

我在主要配置下有单独的配置面(例如测试配置、产品特定的东西、阶段特定的东西等..)

我通过 Global.scala 加载它,如下所示(请注意下面提供的示例也适用于 Play for 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="password!@#$"
db.default.driver=org.postgresql.Driver

这样我可以获得以下好处:

  • 我仍然以通常的方式编写测试
  • Play 演进也在 CI/jenkins 上进行了测试
  • 必须以我可以在现有数据库实例上安全地重新调整它们的方式编写我的测试,其中对数据和用户群的假设最少。这样我 90% 确定我将能够以更少的摩擦在暂存/生产环境中运行它们。 (争议点)

关于java - 如何在 Play Framework 中声明第二个数据库进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20629320/

相关文章:

java - 数字签名的.keystore文件位置

android - 有没有办法在 Travis CI 构建中启动 android 模拟器?

multithreading - Play 2 : Asynchronous Controllers vs HTTP threads

scala - 出现错误 JsValue Expected 但 JsNode supplied

java - 如何在 Sitebricks 中生成 HTML 表格?

java - 从 java 生成带有子报告的 Jasper 报告

java - JUnit 异常测试

angular - 如何以 Angular 创建测试用例以检查本地存储中是否存在值

xcode - 使用 Xcode 4.5 从命令行运行 iOS 单元测试

playframework - 如何在 Play Framework 1.2 中实现 HTTP Basic Auth?