Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用scalamock标记一个特征的值_Scala_Scalamock - Fatal编程技术网

用scalamock标记一个特征的值

用scalamock标记一个特征的值,scala,scalamock,Scala,Scalamock,在下面的(简化)示例中,如何存根从scalamock类继承字段的trait的值 trait MyTrait extends MyClass class MyClass(val location: Location) val expectedValue = ??? val dor: MyTrait = stub[MyTrait] (dor.location.continuousFeatureValues).returns(expectedValue) “location”是MyClass的参数

在下面的(简化)示例中,如何存根从scalamock类继承字段的trait的值

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

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

“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")
}

“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")
}

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

我会重构该代码,因为它有点死路一条,因为trait使用非默认构造函数扩展类。
如果要直接模拟该类,仍然无法在location上定义操作,因为它是
val
,并且在Scala中是不可变的。将其设置为
MyTrait
上的
def
,并让
MyClass扩展MyTrait
,您的设计应该更易于使用(和模拟)。

位置既是构造函数的参数,也是字段成员。我用它实例化MyClass,然后使用它-类似于case类,但它不是case类。这个解决方案似乎需要对我的实际程序进行相当多的更改,我不喜欢在测试时这样做。location既是构造函数的参数,也是字段成员。我用它实例化MyClass,然后使用它-类似于case类,但它不是case类。这个解决方案似乎需要对我的实际程序进行相当多的更改,我不喜欢在测试时这样做。