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

使用scalamock部分模拟类

臧翰采
2023-03-14

我试图测试一个类cls,它具有两个函数:aba加载DataFrameB调用a,然后执行一些操作并返回新的DataFrame。为举例起见:

class Cls {
    def A(dummy: Int): Int = 5
    def B(): Int = A(7) + 1
}

使用scalamock如何编写测试代码?

我试过:

test("test case") {
  val f = stub[Cls]
  f.A _ when 7 returns 5
  assert(f.B() == 6)
}

我希望测试成功通过,并且得到0不等于6(MyTestCase.scala:24)(我知道scalamock用mock替换了所有现有函数,但这不是预期的行为)

编辑:我在mockito中找到了这个引用这个概念的答案,但我不确定scalamock是否支持这种嘲讽,以及为什么要反对这种嘲讽。

共有1个答案

秦博达
2023-03-14

ScalaMock不重写/stub final方法。因此您的解决方案可以是创建一个子类,方法的部分标记为final:

import org.scalamock.scalatest.MockFactory
import org.scalatest.FunSuite

class PartialMockingTest extends FunSuite with MockFactory {

  test("test case") {

    class PartFinalCls extends Cls {
      override final def B(): Int = super.B()
    }

    val f = stub[PartFinalCls]
    f.A _ when 7 returns 5
    assert(f.B() == 6)
  }

}

class Cls {
  def A(dummy: Int): Int = 5
  def B(): Int = A(7) + 1
}
 类似资料:
  • 当我尝试模拟的任何其他方法时,模拟会起作用,但不能使用方法。 这是ScalaMock bug还是我做错了什么?

  • 我需要一些关于如何使用ScalaMock在类内模拟高阶函数的帮助 正如您在上面的代码中所看到的,当您传入一个具有高阶函数的值时,被模拟的函数可以正常工作,但如果您在每个位置键入它,则不会正常工作。在我的用例中,我不能像在第二次测试中那样做 下面是关于用例的更多信息,但对回答这个问题并不完全必要 这是一个简化的示例,但我需要一种方法使前者工作。原因是(我会尽我最大的努力解释这一点)我有一个正在测试的

  • 我对ScalaMock和嘲笑都是新手。我试图测试一个方法,它调用另一个(mocked)类中的方法,然后在返回的对象上调用方法。 详细资料: 所以我使用ScalaTest,这个测试涉及到五个类... 我正在测试的子指令 在测试中必须被嘲笑的机器 构造机器对象所需的寄存器 我创建为原始机器类的MockableMachine没有空构造函数,因此(据我所知)无法模拟 最后是我的测试类SubInstruct

  • 对于Mockito和其他测试框架,通常有方法在测试类中模拟方法的功能。我似乎无法让ScalaMock接受同样的方式。 在测试课上,我是: 我知道,如果你嘲笑/剔除类,然后在真实实例上调用相同的功能,这是行不通的。但是有一些变通方法,可以使用模拟调用等。 如果这是错误的方法,测试在同一个测试类中使用其他方法的方法的最佳方法是什么?我认为解耦方法是最好的实践。 谢谢

  • 有没有办法做到这一点?

  • 我是莫基托的新手。我试图通过模拟数据库交互为服务编写jnuit: 我有下面的类(只是实际类的代表) 我的测试课就像是 但是当我运行这个测试时,它仍然调用实际的db调用并从DB中检索值,而不是模拟值,我应该模拟sql连接和非默认构造函数吗?我一无所知。 -- 更新 正如人们所建议的那样,我将DAO实例化移动到我的服务构造函数中,并且还使用了Spy,但是我仍然调用了实际的DB调用而不是模拟调用。