Scala 如何定义合成集合的“LoneeElement”和“Empty”?

Scala 如何定义合成集合的“LoneeElement”和“Empty”?,scala,scalatest,Scala,Scalatest,我有一个case类,它是一个围绕集合的简单包装器: final case class Foo(foos: Seq[Int]) 在我的测试中,我想断言Foo#foos的空元素和孤立元素。我目前通过直接访问Foo#foos来规避这个问题: foo.foos shouldBe empty 或 这是可行的,但破坏了封装 我已经浏览了scalatest文档,但是还没有找到一种方法来定义这些操作符 我如何定义它们?将它们内联到测试中的额外点数。定义一些用于处理Foo(在test-目录中,而不是在main

我有一个case类,它是一个围绕集合的简单包装器:

final case class Foo(foos: Seq[Int])
在我的测试中,我想断言
Foo#foos
的空元素和孤立元素。我目前通过直接访问
Foo#foos
来规避这个问题:

foo.foos shouldBe empty

这是可行的,但破坏了封装

我已经浏览了scalatest文档,但是还没有找到一种方法来定义这些操作符


我如何定义它们?将它们内联到测试中的额外点数。

定义一些用于处理
Foo
(在
test
-目录中,而不是在
main
源代码树中):

现在,只需将trait
fooists
混合到您想要使用它的
FlatSpec
中:

import org.scalatest._

class FooSpec extends FlatSpec with Matchers with FooImplicits {

  "Foo" should "be empty when it's empty" in {
    Foo(Seq()) shouldBe empty
  }

  it should "have loneElements" in {
    val x = Foo(Seq(1))
    x.loneElement should equal (1)
  }
}
利润:

[info] Foo
[info] - should be empty when it's empty
[info] - should have loneElements

请注意,
FooImplicits
可以在与
main
树中的
Foo
相同的
包中定义,即使它位于完全不同的
test
源代码树中。通过这种方式,它可以访问
Foo

的包可见成员,它真的是
Seq[Int]
,而不是一些通用的
Foo[a](foos:Seq[a])
?@AndreyTyukin它是一种特殊类型,但我的case类并不像上面的case类那么愚蠢=this.elems.isEmpty}
可以工作吗?@mfirry和
LoneElement
“专门化”是指“具体的、非通用的”,而不是“通用的和@specialized的”。我想你说的是我希望你说的,只是想指出,调用类型“specialized”可能会让人困惑,因为泛型有“@specialized”注释;)杰出的干杯
import org.scalatest._

class FooSpec extends FlatSpec with Matchers with FooImplicits {

  "Foo" should "be empty when it's empty" in {
    Foo(Seq()) shouldBe empty
  }

  it should "have loneElements" in {
    val x = Foo(Seq(1))
    x.loneElement should equal (1)
  }
}
[info] Foo
[info] - should be empty when it's empty
[info] - should have loneElements