如何在模拟中传递scala类
我有一个scala类,其中有一个doSomething方法 还有一个B班如何在模拟中传递scala类,scala,scalatest,scalamock,Scala,Scalatest,Scalamock,我有一个scala类,其中有一个doSomething方法 还有一个B班 class B(name: String) 还有一个C类 class C { def doSomethingElse(b: B): String { /// some logic //// } } class A(c: C) { def doSomething(uuid: UUID): String { val b = new B("hello) c.doSomethingEl
class B(name: String)
还有一个C类
class C {
def doSomethingElse(b: B): String {
/// some logic
////
}
}
class A(c: C) {
def doSomething(uuid: UUID): String {
val b = new B("hello)
c.doSomethingElse(b)
// some logic
}
}
现在我想使用scalatest和scalamock测试类doSomething的方法
我试着去嘲笑doSomethingElse的电话
但是当实际调用发生时,mock不会得到满足,因为B的对象不同。有没有一种方法来表达这个模拟,使它得到满足?Thilo的评论是正确的-你的两个B将作为上面的参考进行比较,因为它们不是同一个对象,所以它们不相等。为了实现内容平等,您需要一个适当的equals实现。如果你让B成为一个案例类,你可以在Scala中免费得到它。如果您不能更改类B,那么在ScalaMock中使用谓词mather可能会帮助您在测试期间比较这两个实例。请在此阅读:以下是@Thilo和@PhilippM建议的示例: 像这样重写equals方法
class B(val name: String) {
override def equals(obj: Any): Boolean = obj match {
case b: B => b.name == this.name
case _ => false
}
}
我们可以用普通的
(mockC.doSomethingElse _) expects(new B("hello")) returning("A")
或者如果我们不能修改B,那么就这样尝试
如果您希望新的Bhello被视为等同于另一个新的Bhello,那么您必须相应地实现.equals。默认情况下,仅当同一实例相等时才使用Java实例标识。如果B可以是一个case类,你可以免费得到它。但是我的不是case类,它不一定只是为了让测试通过。是否有任何其他技巧只能用于测试?您是否已经阅读并尝试了谓词匹配器,正如我上面建议的那样?如果这对您不起作用,那么就没有办法,从根本上说,这就是JVM的工作方式。
(mockC.doSomethingElse _) expects(new B("hello")) returning("A")
mockC.doSomethingElse _ expects where { (b: B) => b.name == new B("hello").name } returning "A"