【问题标题】:ScalaTest Matcher For a Java Lambda Call that's Run in a Different Thread用于在不同线程中运行的 Java Lambda 调用的 ScalaTest 匹配器
【发布时间】:2018-08-22 07:25:42
【问题描述】:

在以下 ScalaTest 示例中,obtainLock 是一个 Java 函数,它接受一个 String 和两个用于成功/失败调用的函数接口。这以异步方式发生,这意味着 lambda 是从不同的线程调用的。

使用现有代码,此测试返回 true,因为它在调用任一 lambda 之前退出测试块。我查看了Async Testing Documentation for ScalaTest,但我不确定如何编写测试,因为我调用的Java 函数不返回Future

有没有办法在 ScalaTest 中测试这个异步代码?我正在使用 Scala 2.12、ScalaTest 0.9.6 和 Java 9。

  "Acquiring locks" - {
    "Return a lock for a key with valid lease limit" in {
      locker.obtainLock(lockKeyA, suc => {
        suc.key shouldEqual "AAA"
        suc.validUntilInMs should be > System.currentTimeMillis()
      }, (fmsg, lockInfo) => {
        fmsg shouldBe ""
      })
    }

【问题讨论】:

    标签: java scala unit-testing asynchronous scalatest


    【解决方案1】:

    可能的解决方案是转换为 scala Future。并结合您链接中的 Async* 套件。例如

    sealed trait SomeResult
    case class SomeFailureType(fmsg: ???, lockInfo: ???) extends SomeResult
    case class SomeSuccessType(suc: ???) extends SomeResult
    val p = Promise[SomeResult]
    
    locker.obtainLock(lockKeyA, suc => {
        p.complete(SomeSuccessType(suc))
    }, (fmsg, lockInfo) => {
        p.complete(SomeFailureType(fmsg, lockInfo))
    })
    
    p.future.map {
        case SomeSuccessType(suc) =>
            // assert success returning Future[Assertion]
            // e.g. suc.key shouldEqual "AAA"
        case SomeFailureType(fmsg, lockInfo) =>
            // assert failure returning Future[Assertion]
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-25
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2018-03-04
      • 2021-09-26
      • 2015-09-05
      相关资源
      最近更新 更多