游戏框架:如何将数据库演变应用于虚假的应用测试数据库



我正在使用play框架2.4以及ebean数据模型和演变。目前,我正在尝试使用测试mysql数据库为我的模型编写第一个测试。我想在开始测试之前有一个干净的测试数据库。

到目前为止,我尝试了这个:

public class ModelUnitTest {
    public static FakeApplication app;
    @BeforeClass
    public static void startApp() {
        // Load test config  with testserver
        Map<String, String> settings = new HashMap<String, String>();
        settings.put("db.default.driver", "com.mysql.jdbc.Driver");
        settings.put("db.default.url", "jdbc:mysql://127.0.0.1:3306/sopra-ws1516-team10-test?autoReconnect=true&useSSL=false");
        settings.put("db.default.username", "root");
        settings.put("db.default.password", "root");
        settings.put("play.evolutions.autoApply", "true");
        settings.put("ebean.default", "models.ebean.*");
        app = play.test.Helpers.fakeApplication(settings);
        Evolutions.applyEvolutions(XXXXXX);
        Helpers.start(app);
    }

    @Test
    public void testCreateUser() {
        try {
            User testUser = User.createUser("Max", "Musterman", "01.01.1980", "max.mustermann@gmail.com", "1234");
            assertNotNull(testUser);
        } catch (Exception e) {
            assertNull(e);
        }
    }

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

如果没有进化,它可以工作,但问题是我在开始测试时无法确定是否有空数据库。我的解决方案是在测试之前应用进化,在测试之后应用干净的进化。这将为我的测试提供一个干净的环境。

但实际上,如果没有Database对象,就无法使用 Evolutions 类,而且似乎无法使用我的 FakeApplication 创建的数据库连接来创建数据库对象。

有人有解决这个问题的方法吗?

我通过手动调用注入器来解决它:

private static Database db;
@BeforeClass
public static void startApp() {
    ...
    app = play.test.Helpers.fakeApplication(settings);
    db = app.injector().instanceOf(Database.class);
    Evolutions.applyEvolutions(db);
    Helpers.start(app);
}
@AfterClass
public static void stopApp() {
    Evolutions.cleanupEvolutions(db);
    Helpers.stop(app);
}

相关内容

最新更新