我想在默认数据库以外的数据库上运行单元测试。这是我的 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/