ScalaTest는 Scala에서 기본적으로 제공해주는 타입인 Option, Either에 대한 테스트도 지원해줍니다.
이 역시 간편하게 trait 형태로 제공해주어 필요할경우 상속받아 사용하면 됩니다.
Option test
Option 테스트를 위해서 OptionValues trait를 지원해줍니다.
해당 trait를 상속받으면 Option 타입에 implicit function으로 value 함수를 신규로 지원해주어 이를 통해 assertion 비교를 진행하면 됩니다.
Option의 값을 비교하기 위해 간단히 get을 사용하면 되지 않나 얘기하실 수도 있는데 None에 get을 실행하면 NoSuchElementException이 던져져서 테스트가 실패하지만 어느 테스트에서 실패했는지 StackDepth를 지원해주지 않으므로 꼭 value 함수를 통해 비교해야 합니다.
value를 통해 테스트가 실패하면 TestFailedException 이 던져지므로 테스트 실패에 대한 정보가 표시됩니다.
import org.scalatest.OptionValues
import org.scalatest.funspec.AnyFunSpec
import org.scalatest.matchers.should.Matchers
class OptionSpec extends AnyFunSpec with Matchers with OptionValues {
describe("Option 비교") {
it("비어있는 값은 None이다") {
val sut = Option.empty[Int]
sut shouldBe None
}
it("비어있지 않은 값은 Some이다") {
val sut = Option(123)
sut.value shouldBe 123
}
}
}
Either test
Either 테스트를 위해서 EitherValues trait를 지원해줍니다.
해당 trait를 상속받으면 Either의 left, right 타입에 implicit function으로 value 함수를 신규로 지원해주어 이를 통해 assertion 비교를 진행하면 됩니다.
Either 역시 get으로 테스트를 진행할 수 있지만 Option과 동일하게 StackDepth를 지원해주지 않으므로 꼭 value 함수를 통해 비교해야 합니다.
Either의 Right을 비교하고 싶다면 right.value를 사용하면 되지만, scala 2.13 부터 Either.right이 deprecated 되었으므로 바로 value를 호출하면 됩니다.
Either의 Left를 비교하고 싶다면 left.value를 사용하면 됩니다.
import org.scalatest.EitherValues
import org.scalatest.funspec.AnyFunSpec
import org.scalatest.matchers.should.Matchers
class EitherSpec extends AnyFunSpec with Matchers with EitherValues {
describe("Either 비교") {
it("정상 값은 Right이다") {
val sut = Right(123)
sut.value shouldBe 123
}
it("비정상 값은 Left이다") {
val sut = Left(new RuntimeException("error"))
sut.left.value shouldBe a[RuntimeException]
}
}
}