播放框架:如何将数据库演化应用到伪造的应用程序测试数据库

Posted

技术标签:

【中文标题】播放框架:如何将数据库演化应用到伪造的应用程序测试数据库【英文标题】:Play framework: How to apply database evolution to a fake applikation test database 【发布时间】:2016-03-18 16:44:23 【问题描述】:

我将 play framework 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 创建的数据库连接来创建数据库对象。

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

【问题讨论】:

不太可能我已经找到了解决方案,但我会检查我的旧代码。 【参考方案1】:

我通过手动调用注入器解决了这个问题:

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);

【讨论】:

以上是关于播放框架:如何将数据库演化应用到伪造的应用程序测试数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 intellij 中为播放框架应用程序运行单元测试

如何在具有存储库模式的实体框架中伪造 DbContext.Entry 方法

如何将视频从 Play 2 框架流式传输到 HTML5 播放器

播放框架和 WCF

如何以编程方式将触摸事件伪造为 UIButton?

Flask作为企业级项目的服务端项目在测试骨架蓝图的伪造资源和环境以及出错处理的方法记录