0

我希望这个测试能够通过:

import org.scalamock.scalatest.MockFactory
import org.scalatest.{FlatSpec, Matchers}


class FruitImpl {
  case class FruitName(name: String)
  def getFruitName: Option[FruitName] = {
    Some(FruitName("apple"))
  }
}

class FruitSpec extends FlatSpec with Matchers with MockFactory {
  val f = mock[FruitImpl]
  (f.getFruitName _).expects().returning(None)

  behavior of "getFruitName method"

  it should "return None" in {
    f.getFruitName should === (None)
  }
}

但它失败了:

[error] my/path/QuestionTest.scala:13: overriding method getFruitName in class FruitImpl of type => Option[this.FruitName];
[error]  method getFruitName has incompatible type
[error]   val f = mock[FruitImpl]
[error]               ^  

但是,这有效:

import org.scalamock.scalatest.MockFactory
import org.scalatest.{FlatSpec, Matchers}

case class FruitName(name: String)

class FruitImpl {
  def getFruitName: Option[FruitName] = {
    Some(FruitName("apple"))
  }
}

class FruitSpec extends FlatSpec with Matchers with MockFactory {
  val f = mock[FruitImpl]
  (f.getFruitName _).expects().returning(None)

  behavior of "getFruitName method"

  it should "return None" in {
    f.getFruitName should === (None)
  }
}

唯一的区别是案例类 FruitName 是在 FruitImpl 类之外定义的。为什么一个版本的代码失败而另一个没有?应该如何解决第一个示例中的错误?

4

1 回答 1

0

在不查看 ScalaMock 代码的情况下,我会说 mock 不是FruitImplOO 意义上的真正派生。它的目的是允许方法拦截,所以它只处理外观。然后,模拟实际上没有路径依赖类型的定义FruitName,因此不能使用依赖于它的方法签名。

这正是为什么定义FruitName移出FruitImpl. 它现在独立于 mock 存在,依赖于它的方法签名然后按预期工作。

于 2017-11-03T08:17:24.510 回答