Scala 工具包

如何测试异常?

语言

你可以在一行中要求整个工具包

//> using toolkit latest

MUnit 作为一个测试框架,仅在测试文件中可用:test 目录中的文件或具有 .test.scala 扩展名的文件。请参阅 Scala CLI 文档 以了解有关测试范围的更多信息。

或者,你只需要 MUnit 的特定版本

//> using dep org.scalameta::munit:1.0.0-M7

在你的 build.sbt 文件中,你可以添加对 toolkit-test 的依赖

lazy val example = project.in(file("example"))
  .settings(
    scalaVersion := "3.2.2",
    libraryDependencies += "org.scala-lang" %% "toolkit-test" % "0.1.7" % Test
  )

这里的 Test 配置表示该依赖项仅由 example/src/test 中的源文件使用。

或者,你只需要 MUnit 的特定版本

libraryDependencies += "org.scalameta" %% "munit" % "1.0.0-M7" % Test

在你的 build.sc 文件中,你可以添加一个 test 对象,扩展 TestsTestModule.Munit

object example extends ScalaModule {
  def scalaVersion = "3.2.2"
  object test extends Tests with TestModule.Munit {
    def ivyDeps =
      Agg(
        ivy"org.scala-lang::toolkit-test:0.1.7"
      )
  }
}

或者,你只需要 MUnit 的特定版本

ivy"org.scalameta::munit:1.0.0-M7"

拦截异常

在测试中,你可以使用 intercept 来检查你的代码是否抛出异常。

import java.nio.file.NoSuchFileException

class FileTests extends munit.FunSuite {
  test("read missing file") {
    val missingFile = os.pwd / "missing.txt"
    
    intercept[NoSuchFileException] { 
      os.read(missingFile)
    }
  }
}
import java.nio.file.NoSuchFileException

class FileTests extends munit.FunSuite:
  test("read missing file") {
    val missingFile = os.pwd / "missing.txt"
    intercept[NoSuchFileException] {
      // the code that should throw an exception
      os.read(missingFile)
    }
  }

intercept 断言的类型参数是预期的异常。这里它是 NoSuchFileExceptionintercept 断言的主体包含应该抛出异常的代码。

如果代码抛出预期的异常,则测试通过,否则测试失败。

intercept 方法返回抛出的异常。您可以在其上检查更多断言。

val exception = intercept[NoSuchFileException](os.read(missingFile))
assert(clue(exception.getMessage).contains("missing.txt"))

您还可以使用更简洁的 interceptMessage 方法在一个断言中测试异常及其消息。在 MUnit 文档 中了解有关它的更多信息。

此页面的贡献者