我一直在看StackOverflow上的一些帖子,以了解如何使用MYSQL数据库设置测试。
我只是想测试一些 Controller 方法,这将需要一个包含一些数据的测试数据库以返回有意义的结果。我想使用一个真实的MYSQL数据库,因为这就是我将在生产中使用的数据库,并且我已阅读到MYSQL与Play提供的InMemory数据库之间有很多差异。
在诸如this one和this blog about testing Play! applications之类的帖子中,这些帖子显示了一些示例,这些示例使用数据库参数初始化FakeApplication对象,然后调用Helper.start(fakeApp)。
Helper.start(FakeApplication app)的docs提供以下描述:
太好了。但是,实际上通过调用start触发了哪些过程,这将给我带来什么测试呢?
Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.url", "jdbc:mysql://localhost/testdb");
settings.put("db.default.user", "root");
settings.put("db.default.password", "");
app = Helpers.fakeApplication(settings);
Helpers.start(app);
我希望上面的代码可以将Ebean配置为使用我的测试数据库,但是当我尝试执行诸如Ebean.save()之类的方法时,我收到一条错误消息,指出未向Ebean注册任何默认数据库。为了注册,我将需要填充ServerConfig对象并从EbeanServerFactory创建一个EbeanServer。在那种情况下,将设置映射传递给FakeApplication对象有什么意义吗?再说一次,启动FakeApplication实际上是做什么的?如何使用?
提前致谢。
最佳答案
我意识到您是一年多以前问过的,但是我花了很多时间自己解决这个问题,因此希望这可以在某个时候对某人有所帮助。
在运行FakeApplication的情况下,您基本上可以说出“激活运行器”之后执行所有操作,除了没有网络服务器(网络)运行服务请求。但是,您可以将其 Controller 测试为shown here,并调用访问数据库的方法。
除了this one之外,我实际上引用了您在解决此问题时提到的这两篇文章,其中ojit_a讨论了一些必须设置的特殊 Play 魔术配置变量,您将在下面的示例中看到。
我创建了一个抽象的FakeApplicationTest类,该类在单元/功能测试中进行了扩展。我首先使用现有的application.conf文件,然后覆盖某些参数以针对其他数据库进行测试。 FakeApplication启动后,我将阅读所有演变内容并创建一个新的数据库以对其进行测试。
public abstract class FakeApplicationTest {
protected static FakeApplication app;
/**
* Create a new FakeApplication using all our custom config vars that test against diff DB's
*
* @return
*/
public static FakeApplication createFakeApp() {
// grab the main application.conf file that is used to start up the Play application
Config config = ConfigFactory.parseFile(new File("conf/application.conf"));
// resolve all variables within this config file with other variables within itself
config = ConfigFactory.load(config);
// create a Configuration object out of this and then turn it into a Map to be modified
Configuration configuration = new Configuration(config);
Map<String, Object> fakeApplicationConf = Maps.newHashMap(configuration.asMap());
// do some crazy stuff here because Play wants us to for config voodoo, see:
// http://www.stupidjavatricks.com/2013/05/changing-play-2-db-configuration-at-runtime-beware-of-dragons/
Configuration akka = configuration.getConfig("akka.actor.serialization-bindings");
addValue(fakeApplicationConf, "akka.actor.serialization-bindings", null);
addValue(fakeApplicationConf, "akka.actor.serialization-bindings.\"[B\"", akka.getString("\"[\"B"));
addValue(fakeApplicationConf, "akka.actor.serialization-bindings.\"java.io.Serializable\"", akka.getString("\"java.io.Serializable\""));
// point at a different test database
addValue(fakeApplicationConf, "db.default.url", "jdbc:mysql://127.0.0.1/testdb");
addValue(fakeApplicationConf, "db.default.user", "someuser");
addValue(fakeApplicationConf, "db.default.password", "hunter2");
// disable evolutions and just create the DB manually
addValue(fakeApplicationConf, "evolutionplugin", "disabled");
return Helpers.fakeApplication(fakeApplicationConf);
}
@BeforeClass
public static void setUp() throws Exception {
app = createFakeApp();
// fire up the Fake Application!
Helpers.start(app);
// after we start up the application, create a database
createCleanDb();
}
@AfterClass
public static void tearDown() throws Exception {
Helpers.stop(app);
}
...
}
读取演变并按顺序应用它们还有很多,但是我暂时不做介绍。
关于java - 玩! Framework FakeApplication-它实际上是做什么的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22581423/