Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Play framework-在不启动应用程序的情况下测试数据访问层_Scala_Unit Testing_Playframework 2.0 - Fatal编程技术网

Scala Play framework-在不启动应用程序的情况下测试数据访问层

Scala Play framework-在不启动应用程序的情况下测试数据访问层,scala,unit-testing,playframework-2.0,Scala,Unit Testing,Playframework 2.0,有没有一种方法可以在PlayFramework2.x中为数据访问对象(DAO)编写测试而不启动应用程序 即使数据库是内存中的H2,使用假应用程序的测试也相对缓慢,正如文档所示。对于单元测试,一个好的解决方案是模拟。如果您使用的是Play2.4及更高版本,Mockito已经内置,您不必单独导入Mockito 对于集成测试,您不能在没有假应用程序的情况下运行测试,因为有时DAO可能需要应用程序上下文信息,例如application.conf中定义的信息。在这种情况下,必须使用假应用程序配置设置假应用

有没有一种方法可以在PlayFramework2.x中为数据访问对象(DAO)编写测试而不启动应用程序


即使数据库是内存中的H2,使用假应用程序的测试也相对缓慢,正如文档所示。

对于单元测试,一个好的解决方案是模拟。如果您使用的是Play2.4及更高版本,Mockito已经内置,您不必单独导入Mockito

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


此示例repo包含服务层和控制器层的测试,包括Mockito单元测试和集成测试。DAO的集成测试应该与服务测试非常相似。希望它能给您一个如何使用Mockito编写DAO测试的提示。

在使用FakeApplication测试的执行时间遇到类似问题后,我换了另一种方法。我没有为每个测试创建一个假的应用程序,而是启动应用程序的一个真实实例,并对其运行所有测试。有了一个大型测试套件,总的执行时间就有了很大的提高


事实证明,数据库对象可以直接从数据库工厂构建,因此最终具有如下特征:

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

感谢您的回答,例如,在测试控制器时,我们使用mock来模拟DAO,但是我们也喜欢在不启动完整应用程序的情况下为DAO编写测试。感谢Dmitry的回答,这是一种有趣的方法(当然是创新的:-))。我不太喜欢大型集成套件,我更喜欢专注于测试每个类,只保留一小部分集成测试,以确保完整性。我仍然在寻找只使用DB测试DAO而不启动完整应用程序的方法。但在实施健全性测试时将保留您的博客帖子。您能提供一个关于如何在套件中使用此功能的片段吗?当然,添加了示例