Unit testing Play框架测试和松耦合

Unit testing Play框架测试和松耦合,unit-testing,playframework-2.0,loose-coupling,Unit Testing,Playframework 2.0,Loose Coupling,嗨,我正在开发一个Play 2应用程序 按照惯例,有视图、模型和控制器。查看呼叫控制器(按路由)和控制器呼叫模型。模型由给定查找器启动的数据库调用填充数据 现在,我创建了我的第一个控制器测试。我要测试的控制器方法是一个调用用户模型本身的方法(user=user.findByName(“someName”);)。这意味着这个方法和这个模型类是耦合的。为了测试这个方法,我必须用testdata建立一个内存中的数据库,在测试过程中用户模型的查找器调用这个数据库。但这使得我的单元测试变成了集成测试。因为

嗨,我正在开发一个Play 2应用程序

按照惯例,有视图、模型和控制器。查看呼叫控制器(按路由)和控制器呼叫模型。模型由给定查找器启动的数据库调用填充数据

现在,我创建了我的第一个控制器测试。我要测试的控制器方法是一个调用用户模型本身的方法(user=user.findByName(“someName”);)。这意味着这个方法和这个模型类是耦合的。为了测试这个方法,我必须用testdata建立一个内存中的数据库,在测试过程中用户模型的查找器调用这个数据库。但这使得我的单元测试变成了集成测试。因为每个控制器方法都是静态的,所以我不能注入模型的模拟。这是游戏推荐的正确方式吗?或者有没有一种方法可以在测试期间用模拟来替代模型

我考虑过由模型提供者访问模型,或者在测试中用模拟来代替模型

你觉得怎么样?还是这太过分了

塔克斯
尼克

我也觉得这很难。我最终做的是使用一个工厂来获取模型类,并注入一个模拟类而不是原来的类

如果用简单的内存中数据库替换模型,它仍然被视为单元测试。这也可以为你做的把戏,应该不是很难设置

有一件事对我来说很难找到,那就是如何为测试设置一个不同的conf文件。这段代码就完成了这个任务。确保您有一个test.conf文件,其中配置了内存中的模拟数据库

protected Configuration additionalConfigurations;

protected AbstractTest()
{
    Config additionalConfig = ConfigFactory.parseFile(new File("conf/test.conf"));
    additionalConfigurations = new Configuration(additionalConfig);
    start(fakeApplication(additionalConfigurations.asMap(),fakeGlobal()));
}