Scala 单元测试 - 存根单例

Dan*_*ani 1 unit-testing scala mocking

我是 Scala 单元测试的新手,我找不到一种方法来存根在单例对象中定义的函数。

例如:

class Profile {
  def getLatest
    ...
    Feed.getLatestEntries
    ...
}

object Feed {
  def getLatestEntries: Future[List[FeedEntry]] { /* Access some API*/ }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试对getLatestProfile 类中定义的函数进行单元测试。由于我不想在我的单元测试中通过 Web 实际访问外部 API,因此我试图存根Feed对象及其getLatestEntries函数以返回一些预定义的值。

我研究了 ScalaMock、EasyMock 和 Mockito 框架,但找不到一种方法来存根单例对象的方法。ScalaMock 状态

为什么所有的模拟框架都不提供这个功能?我怎样才能做到这一点?存根Feed.getLatestEntries

谢谢

Arn*_*sen 5

我的方法是将单例的逻辑创建为特征,然后让对象扩展特征。这允许我将 Singleton 作为默认或隐式参数提供,但提供用于测试的存根实现

trait FeedLogic {
  def getLatestEntries: Future[List[FeedEntry]] { /* Access some API*/ }
}

object Feed extends FeedLogic

def somethingWantingFeed(...)(feed: FeeLogic = Feed) = { ??? }
Run Code Online (Sandbox Code Playgroud)

  • 很公平。但是将对象函数提取到特征中只是为了使它们可存根对我来说似乎很棘手 - 我认为测试技术问题不应影响我的代码设计。是否有任何其他理由将所有对象函数提取为特征? (2认同)