我看到了多个关于如何模拟伴随对象的问题,经常提到的答案是使用 scalamock,但根据doc http://scalamock.org对于版本 3,模拟伴生对象仍标记为将来使用。
那么模拟伴生对象的方法是什么呢?如果没有,是否有比我已经启用测试更好的方法来做事情?
使用play框架的代码:
Model
case class Article(id: String, preview: String)
object Article {
def get(id: String) = {
......
}
}
文章资源
class ArticleResource extends Controller {
def getArticle(id: String) = authenticate {
......
Article.get(id)
......
}
}
我如何嘲笑Article.get(id)
?
在我让它工作之前,我以不同的方式构建了代码:
工作测试方法
Model
case class Article(id: String, preview: String)
Service
class ArticleService {
def get(id: String) = {
......
}
}
object ArticleService {
def apply = new ArticleService
}
文章资源
class ArticleResource(articleService: ArticleService) {
def getArticle(id: String) = authenticate {
......
articleService.get(id)
......
}
}
object ArticleResource extends controllers.ArticleResource(ArticleService())
在测试中我注入了mock[ArticleService]
进入资源进行测试。
我一直听说前一种方法(模型)是“正确”的方法,我从来不明白为什么,所以我尝试了它并在测试中遇到了问题,但我仍然不明白为什么它是更好的方法。 (考虑到测试的困难,我实际上对后一种方法的感觉更强烈)
所以我有两个问题:
- 有没有办法模拟伴生对象?
- 是否有一种“正确”的方法来构建代码?如果有,为什么?