Play框架 - 测试数据访问层而无需启动应用程序

时间:2015-11-15 13:48:20

标签: scala unit-testing playframework-2.0

有没有办法在play framework 2.x中为数据访问对象(DAO)编写测试而无需启动应用程序?

即使数据库是文档建议的内存H2,使用假应用程序的测试也相对较慢。

3 个答案:

答案 0 :(得分:3)

在使用FakeAplication遇到类似的测试执行时间后,我改用了不同的方法。我没有为每个测试创建一个假应用程序,而是启动应用程序的真实实例并针对它运行所有测试。使用大型测试套件可以大大节省总执行时间。

http://yefremov.net/blog/fast-functional-tests-play/

答案 1 :(得分:1)

对于单元测试,一个好的解决方案是嘲笑。如果您使用的是Play 2.4及更高版本,Mockito已经内置,您无需单独导入mockito。

对于集成测试,您无法在没有虚假应用程序的情况下运行测试,因为有时您的DAO可能需要应用程序上下文信息,例如application.conf中定义的信息。在这种情况下,您必须使用假应用程序配置设置FakeApplication,以便DAO具有该信息。

此样本仓库https://github.com/luongbalinh/play-mongo/tree/master/test包含服务层和控制器层的测试,包括Mockito的单元测试和集成测试。 DAO的集成测试应该与服务测试非常相似。希望它能为您提供如何使用Mockito编写DAO测试的提示。

答案 2 :(得分:1)

事实证明,Database对象可以直接从Databases工厂构建,因此最终得到了类似这样的特征:

trait DbTests extends BeforeAndAfterAll with SuiteMixin { this: Suite =>
      val dbUrl = sys.env.getOrElse("DATABASE_URL",
            "jdbc:postgresql://localhost:5432/testuser=user&password=pass")
     val database = Databases("org.postgresql.Driver", dbUrl, "tests")

     override def afterAll() = {
      database.shutdown()
    }
}

然后按以下方式使用它:

class SampleDaoTest extends DbTests {
   val myDao = new MyDao(database) //construct the dao, database is injected so can be passed
   "read form db" in {
       myDao.read(id = 123) mustEqual MyClass(123)
   } 
}
相关问题