1

我正在尝试使用蛋糕图案和模拟。在阅读了一堆包含大量时髦术语的博客文章后,我无法让它发挥作用:(

我正在使用 Spray 并拥有以下 http 服务

trait ApiServiceAbstract extends HttpService with SprayJsonSupport {
  this : AppProvider =>
// tons of routes here
}

AppProvider在哪里

trait AppProvider {
  val api : ApiManager
}

对于真正的服务器,我像这样组合它

class ApiServiceActor extends Actor with ApiServiceAbstract with RealApiManager {
}

在哪里RealApiManager延伸AppProvider

ApiManager必须混入DbProvider其中看起来像这样

trait ApiManager {
  this : DbProvider =>
}

trait RealDbProvider extends DbProvider {
  override lazy val dbManager = new DBManager
}

在我的单元测试中,我只想测试 http 部分并进行了模拟ApiManager,它只是检查客户端传递的对象是否正确。

我不能做到这一点

override lazy val api = mock[ApiManager]

因为ApiManager必须与DbProvider. 我怎样才能解决这个问题 ?我现在看到两个选项:

  • 切换到可以使用带参数的构造函数实例化类的模拟库(例如 Mockito)
  • 添加init(db : DBManager)方法并拥有var其中ApiManager丑陋的
4

1 回答 1

1

我不确定我的答案,因为您没有提供所有源代码(ApiManager ...)

您可以创建一个中间特征。

trait ApiManagerDefaultMixin extends ApiManager with DbProvider

接着

val apiManager = new ApiManagerDefaultMixin { 
    override lazy val api = mock[ApiManager]
}
于 2013-08-21T08:19:00.047 回答