有没有办法在play framework 2.x中为数据访问对象(DAO)编写测试而无需启动应用程序?
即使数据库是文档建议的内存H2,使用假应用程序的测试也相对较慢。
答案 0 :(得分:3)
在使用FakeAplication遇到类似的测试执行时间后,我改用了不同的方法。我没有为每个测试创建一个假应用程序,而是启动应用程序的真实实例并针对它运行所有测试。使用大型测试套件可以大大节省总执行时间。
答案 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)
}
}