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

如何创建一个不调用底层对象构造函数的ScalaMock存根?

谢骏奇
2023-03-14
class BrokenClass(s: String) {
  private val len = s.length
  def length(): Int = len
}

class BrokenTest extends FlatSpec with Matchers with MockFactory {

  "A BrokenClass" should "stub correctly" in {
    val stubThing = stub[BrokenClass]
    (stubThing.length _) when () returns (10)
    stubThing.length should equal (10)
  }

}

在ScalaMock的旧版本中,这段代码可以工作。在Scala2.12和Scalamock3.6中,我得到了一个NullPointerException,因为即使我创建了一个存根,它仍然在调用BrokenClass的构造函数的“s.length”行。所以它试图取消引用“s”,它是空的,因为我没有传递任何东西给它,因为我想要的只是一个存根,它在调用特定方法时返回一个特定值。

有没有一种方法可以在不调用对象的构造函数的情况下创建存根?为什么这在旧版本中起作用?

共有1个答案

伏建修
2023-03-14

ScalaMock使用宏定义生成子类。该宏将在编译器运行期间展开/计算。

由于模拟是子类,将调用超类的构造函数--没有例外。你也许可以使用一些cglib魔法来解决这个问题,但这不是我所熟悉的。

因此,这在旧的ScalaMock版本中可能是可能的,但在当前的实现中,这一特性不会很快恢复。

class NotSoBrokenClass extends BrokenClass("")
...
val nsb = mock[NotSoBrokenClass]
...
 类似资料:
  • 我编写了以下代码和驱动程序,但我不知道如何使用两个构造函数创建银行账户对象。一个构造函数获取初始余额,第二个构造函数在没有钱的情况下开设账户。此外,Account tBalance是否应该包括有效性检查? 或者,我可以执行以下操作: 将费用作为描述银行账户的一部分。根据需要更新BankAccount类。用户应该能够为每个帐户设置费用金额,并通过一种方法添加费用。向驱动程序添加代码以演示费用功能。(

  • 我有一个Card类,它包含两个构造函数,你可以在下面的代码中看到。问题是,每个卡片对象包含2个字符串和2个图像,因为我想保存这些对象,所以我必须将图像的路径保存为字符串,然后检索它们,因此需要2个构造函数。然而,使用一些打印语句,我发现每当检索到一张卡片时,就会创建两个独立的对象:一个正常的对象和另一个空的对象。我知道这是因为我在第二张卡中使用第一个构造器创建了一张新卡。有没有办法避免这样的情况,

  • 问题内容: 当我们创建扩展抽象类的Subclass对象时,抽象类构造函数也会运行。但是我们知道我们不能创建抽象类的对象。因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗? 问题答案: 因此,这是否意味着即使构造函数无任何例外地完成运行,也不能保证是否创建了对象吗? 简而言之,a 不会创建对象。它只是 初始化 对象的 状态 。创建对象的是操作员。现在,让我们详细了解一下

  • @adilooze解决方案

  • 我已经做了很多练习,这都有意义,但当我不得不自己从头开始编写代码时,我突然感到很困惑,如果有人能帮我一把,那就太好了。 我有: 然后我有另一个类,在这个类中创建Plane和Flight的实例, 在大多数情况下,它似乎工作正常,但我不知道我应该在这里检索和添加什么…

  • 问题内容: 在Java中,数组是AN对象。我的问题是…创建新数组时是否调用了Object构造函数?我们希望利用这一事实来为Object构造函数提供一些额外的字节码,以检查所构造数组的长度。那行得通吗? 问题答案: 就Java语言规范而言,尽管它们都使用关键字,但类实例创建表达式和数组创建表达式是不同的表达式形式,每种都有自己的规则。数组创建表达式的描述未提及调用构造函数。