当前位置: 首页 > 知识库问答 >
问题:

扩展一个特征的单元测试类-我如何在特征中模拟和存根方法?

乐正瑞
2023-03-14

我正在使用scalatest来单元测试扩展了一个trait的类(从我的类使用该trait作为mixin的意义上说)。

trait MyTrait {
  def usefulMethod(i: int) = {...}
}


class MyClass extends MyTrait {
  def numberCruncher = {
     val x = usefulMethod(1) + 1
  }
}

问题:以这种方式使用traits-as-a-mixin是否实际上阻止了使用模拟框架来模拟/存根mixin中的方法进行单元测试的能力?例如,模拟和截短框架是否依赖于依赖注入的使用?

ps.我一直在使用Mockito,但我并不反对使用scalamock或任何其他框架。我之所以研究scalamock,是因为它宣传它可以测试特性,但从scalamock自己的测试来看,虽然它可以模拟特性,但您只能在将特性作为依赖项传递给类(而不是扩展该特性的类)的情况下对行为进行存根模拟。请参阅此处

共有1个答案

颛孙和颂
2023-03-14

我通常对测试中的类进行子类化,以替换我想要模拟的方法:

var usefulInput: Option[Int] = Nont
val testInstance = new MyClass {
  override def usefulMethod(i: Int) = {
    usefulInput = Some(i)
    42
  }
}

testInstance.numberCruncher should equal(43)
usefulInput should equal(Some(1))

我发现内联重写通常比任何模拟框架更容易实现和阅读

 类似资料:
  • 我当前的Cucumber文件如下所示: 所以现在我想再添加几个场景,可能是在同一个文件中进行API测试。所以我想为此创建一个新特性,而不是使用Feature:Test Online application页面。这样我就不需要为API测试创建单独的特性文件。

  • 我有一些基于不成形HLists的类型: 我想定义一个sealed trait

  • 我的情况是,我希望一些对象实现一个特征,比如说“基本”,而其他一些对象将实现一个特征“超级”。Super trait还必须是< code>T : Base的泛型,这样我就可以根据它所专用的Base自动实现Super的各个部分。现在,这似乎可以很好地处理下面的小例子 我的问题与我的下一个要求有关,那就是我希望能够存储实现Super的对象向量,而不管它专门用于哪个Base。我的想法是创建一个涵盖所有超

  • 我有一个设计问题,当使用类似的东西时: 我认为应该有一些更好的方法来实现这种参数化的特性。 我在std中没有找到好的示例(例如,在具有类似的关联类型的traits中没有实现)?

  • 在类中,我有一个函数,它调用另一个函数: 我要使用对进行单元测试: 我的实现代码抛出并不容易,我如何使测试代码模拟一个RuntimeException&抛出它呢? (除了纯JUnit之外,我正在考虑使用Mockito,但不确定如何抛出RuntimeException)