在下面(简化)的示例中,如何使用scalamock存储从类继承字段的特征的值?
trait MyTrait extends MyClass
class MyClass(val location: Location)
val expectedValue = ???
val dor: MyTrait = stub[MyTrait]
(dor.location.continuousFeatureValues).returns(expectedValue)
答案 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
,您的设计应该更容易使用(和模拟)。