如何在ScalaTest的FunSuite中测试Scalaz的===运算符?
解决ScalaTest FunSuite中使用Scalaz ===运算符的问题
你遇到的问题根源在于ScalaTest的FunSuite默认混入了AssertionSugar特质,其中定义的===隐式转换(将值包装为Equalizer)优先级高于Scalaz提供的===隐式转换,导致编译器优先选择ScalaTest的版本。下面给出几个可行的解决方案:
方案1:遮蔽ScalaTest的Equalizer隐式转换
通过导入ScalaTest的AssertionSugar但排除Equalizer,就能禁用其===逻辑,让Scalaz的===生效:
import org.scalatest.FunSuite import org.scalatest.AssertionSugar.{Equalizer => _, _} // 遮蔽ScalaTest的Equalizer import scalaz.Scalaz._ class ComparisonTest extends FunSuite { test("=== operator of Scalaz") { assert(1 === 1) // 现在调用的是Scalaz的=== } }
方案2:使用Scalaz内置的断言语法
Scalaz提供了专门的assert_===语法,不需要依赖ScalaTest的===,直接就能验证相等性,且不相等时会抛出AssertionError,ScalaTest会正常捕获并标记测试失败:
import org.scalatest.FunSuite import scalaz.Scalaz._ class ComparisonTest extends FunSuite { test("=== operator of Scalaz") { 1 assert_=== 1 // 直接使用Scalaz的断言逻辑 } }
方案3:显式调用Scalaz的Equal实例
如果只是想验证Scalaz的相等逻辑,也可以绕过运算符,直接调用Equal实例的equal方法:
import org.scalatest.FunSuite import scalaz.Scalaz._ class ComparisonTest extends FunSuite { test("=== operator of Scalaz") { assert(Equal[Int].equal(1, 1)) } }
补充:为什么直接new EqualOps会失败?
你之前尝试new EqualOps[Int](1)编译报错,是因为EqualOps的构造函数被标记为private[scalaz],只能通过Scalaz内部的隐式转换生成实例,不能直接手动实例化。
内容的提问来源于stack exchange,提问作者tmucha
相关产品推荐
相关产品推荐

