You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:50