如何在Scala测试中返回正确的值

如何在Scala测试中返回正确的值,scala,scalatest,stub,either,scalamock,Scala,Scalatest,Stub,Either,Scalamock,我有一个方法返回[Exception,String] class A { def validate(a: Any) = { case a: String => Left(...some.. exception) case a: Any => Right(a) } } class B(a: A) { def callValidate(any: Any) = { a.validate(any) } } 现在我为类B

我有一个方法返回[Exception,String]

class A {
    def validate(a: Any) = {
        case a: String => Left(...some.. exception)
        case a: Any => Right(a)
   }
 }

class B(a: A) {
    def callValidate(any: Any) = {
      a.validate(any)
 }
}

现在我为类B编写测试,并验证存根方法

class BTest  {
   val param: Any = "22"
   val a = mock[A]
   (a.validate _).expects(param).returning(....someValue...) // . this value should be Right(....) of either function. 
} 

是否可以通过这种方式存根它以返回
函数的右(…)?

当B获取a的对象时,您可以在BTest类中创建a的新对象,并重写方法validate以在返回右(a)后返回您想要的任何内容,并覆盖左部分返回左(a)

或者你可以这样做。如建议的那样

(a.validate _).expects(param).returning(Right("a"))

这在给定的场景中可以很好地工作,但是如果您执行类似mockObject.something的操作,那么它将为您提供NullPointerException。我建议您重写validate方法并返回您想要的内容。

为什么要使用
Any
?这只是一个示例。它可以是任何东西。你不能只说
(a.validate u2;).expects(param).returning(Right(“a”)
?你可以不使用mock[a]just do val r=new a(a:Any){override validate(a:Any)return Right(a)}就可以使用它来断言值。即使是一个例子,也不建议使用
Any
(a.validate _).expects(param).returning(Right("a"))