我试图测试一个类cls
,它具有两个函数:a
和b
。a
加载DataFrame
,B
调用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是否支持这种嘲讽,以及为什么要反对这种嘲讽。
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接受同样的方式。 在测试课上,我是: 我知道,如果你嘲笑/剔除类,然后在真实实例上调用相同的功能,这是行不通的。但是有一些变通方法,可以使用模拟调用等。 如果这是错误的方法,测试在同一个测试类中使用其他方法的方法的最佳方法是什么?我认为解耦方法是最好的实践。 谢谢
有没有办法做到这一点?
我有几个类遵循“模板方法”模式。抽象类A,具体扩展类B和C,如下所示: 我想编写一个测试来验证当getData()抛出某个Exception时是否抛出其他Exception。我真的希望避免模拟强制getData()抛出所需的所有复杂依赖关系。我不关心getData()如何抛出,我只想让它抛出。所以我想我要的是部分模拟。这就是我所拥有的: 这个测试在我看来很好,但当我运行它时,我得到了这样的结果: