用scalamock保持特征的val

时间:2016-10-25 12:26:29

标签: scala scalamock

在下面(简化)的示例中,如何使用scalamock存储从类继承字段的特征的值?

trait MyTrait extends MyClass
class MyClass(val location: Location)

val expectedValue = ???
val dor: MyTrait = stub[MyTrait]
(dor.location.continuousFeatureValues).returns(expectedValue)

2 个答案:

答案 0 :(得分:0)

'location'是MyClass的参数还是MyClass的数据成员?可以将MyClass更改为:

class MyClass() {
  val location: Location = new Location
}

如果没问题,您可以覆盖该位置作为解决方法:

//source code
class Location {
  def continuousFeatureValues: String = "location"
}

class MyClass() {
  val location: Location = new Location
}

class MyTrait extends MyClass

// test code
it should "mock" in {
  val loc = mock[Location]
  val dor: MyTrait = new MyTrait {override val location = loc}
  (loc.continuousFeatureValues _).expects().returning("good")
  dor.location.continuousFeatureValues shouldBe ("good")
}

答案 1 :(得分:0)

我会重构那段代码,因为它是一个带有特性的死胡同,它使用非默认构造函数扩展一个类。 如果您要直接模拟该类,则仍然无法在位置上定义操作,因为它是val,并且这些操作在Scala中是不可变的。在def上设MyTrait并拥有MyClass extend MyTrait,您的设计应该更容易使用(和模拟)。