我一直在看StackOverflow上的一些帖子,以了解如何使用MYSQL数据库设置测试。

我只是想测试一些 Controller 方法,这将需要一个包含一些数据的测试数据库以返回有意义的结果。我想使用一个真实的MYSQL数据库,因为这就是我将在生产中使用的数据库,并且我已阅读到MYSQL与Play提供的InMemory数据库之间有很多差异。

在诸如this onethis 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/

10-10 11:06