【问题标题】:How to return a value of Right value of Either in Scala test如何在Scala测试中返回Either的Right值
【发布时间】:2019-02-09 15:36:54
【问题描述】:

我有一个返回 Either[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. 
} 

是否有可能以这种方式存根返回 Either 函数的 Right(.....) ?

【问题讨论】:

  • 你为什么使用Any
  • 这只是一个例子。它可以是任何东西。
  • 你不能直接说(a.validate _).expects(param).returning(Right("a"))吗?
  • 你可以在不使用 mock[A] 的情况下做到这一点,只需执行 val r= new A(a:Any){ override validate(a:Any) return Right(a) } 然后你可以使用它来断言值。
  • 即使举个例子,也不推荐Any

标签: scala scalatest stub either scalamock


【解决方案1】:

由于 B 正在获取 a 的对象,您可以在 BTest 类中创建 A 的新对象并重写方法 validate 以在返回 Right(a) 后返回您想要的任何内容,并覆盖 Left 部分返回 Left(a)。

    class BTest  {
       val param: Any = "22"
       val a = new A{
override def validate(a:Any) = case _ => Right(a)
}
   (a.validate _).expects(param).returning(Right("22"))
} 

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

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

这在给定的场景中可以正常工作,但如果您执行类似 mockObject.something 的操作,那么它会给您 NullPointerException。我建议你重写 validate 方法并返回你想要的。

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多