Scala测试与模式匹配最佳实践

Scala测试与模式匹配最佳实践,scala,testing,junit,Scala,Testing,Junit,我想测试我的方法,它返回一个或。我就是这样做的: @Test def `Test empty name is not valid`: Unit = { val book = createBook() val result = insertEntryToBook(book, "", "12345") result match { case Left(InvalidNameFormat) => true case _ => fail()

我想测试我的方法,它返回一个或。我就是这样做的:

@Test def `Test empty name is not valid`: Unit = {
    val book = createBook()
    val result = insertEntryToBook(book, "", "12345")

    result match {
      case Left(InvalidNameFormat) => true
      case _ => fail()
    }
  }

我是否应该执行一些assert()调用而不是fail(),以使测试的失败消息更加明确(例如,对于断言端到端视图)?

没有理由在这里进行模式匹配。您可以断言结果等于包装在
Left()中的预期值


如果测试失败,您会收到一条准确的错误消息

这里没有理由进行模式匹配。您可以断言结果等于包装在
Left()中的预期值

如果测试失败,您会收到一条准确的错误消息

ScalaTest,所以考虑混合,它应该提供更多信息性信息< /P>
import org.junit.Test
import org.scalatest.{EitherValues, Matchers}

class ExampleSuite extends Matchers with EitherValues {
  @Test def matchEithers(): Unit = {
    val result: Either[String, Int] = Right(42)
    result.left.value should be ("Boom")
  }
}

org.scalatest.exceptions.TestFailedException: The Either on which left.value was invoked was not defined as a Left.

    at org.scalatest.EitherValues$LeftValuable.value(EitherValues.scala:124)
    at example.ExampleSuite.matchEithers(ExampleSuite.scala:9)
    ...

ScalaTest,因此考虑混合应该给出更多信息性信息< /P>

import org.junit.Test
import org.scalatest.{EitherValues, Matchers}

class ExampleSuite extends Matchers with EitherValues {
  @Test def matchEithers(): Unit = {
    val result: Either[String, Int] = Right(42)
    result.left.value should be ("Boom")
  }
}

org.scalatest.exceptions.TestFailedException: The Either on which left.value was invoked was not defined as a Left.

    at org.scalatest.EitherValues$LeftValuable.value(EitherValues.scala:124)
    at example.ExampleSuite.matchEithers(ExampleSuite.scala:9)
    ...

是的,你应该创建两个单独的测试来检查“积极”和“消极”的方式。目前,您的测试不是确定性的,可能会返回不同的结果。也可以使用断言来检查结果。但复杂的情况又如何呢?例如,当我需要先将json解析到某个类,然后生成UUID之类的字段时,最好的方法是为给定的示例准备
测试套件。您的测试应该是确定性的(对于相同的输入,总是返回相同的值)。您不应该在特定的测试场景中放置随机数据。尝试使用
ScalaTest
并为给定的输入准备一些测试场景。是的,您应该创建两个单独的测试来检查“肯定”和“否定”方式。目前,您的测试不是确定性的,可能会返回不同的结果。也可以使用断言来检查结果。但复杂的情况又如何呢?例如,当我需要先将json解析到某个类,然后生成UUID之类的字段时,最好的方法是为给定的示例准备
测试套件。您的测试应该是确定性的(对于相同的输入,总是返回相同的值)。您不应该在特定的测试场景中放置随机数据。尝试使用
ScalaTest
并为给定的输入准备一些测试场景。