对于我的Java应用程序,我试图使用ScalaCheck编写一些基于属性的单元测试。为此,我需要生成器,但是我可以找到的所有教程都使用带有参数的构造函数来生成对象。
我需要生成的对象没有构造函数参数,并且我无法添加这样的构造函数,因为它来自外部库。

我现在有以下内容(JwtClaims来自软件包org.jose4j.jwt):

def genClaims: Gen[JwtClaims] = {
    val url = arbString
    val username = arbString

    val claims = new JwtClaims()
    claims.setNotBeforeMinutesInThePast(0)
    claims.setExpirationTimeMinutesInTheFuture(60)
    claims.setSubject(username) // error about Gen[String] not matching type String

    claims
}


关于如何编写生成器的任何建议?我对Scala的知识为零,因此,如果我犯了一个“明显的”错误,请耐心等待:)我的专长是Java,使用ScalaCheck进行测试是我对Scala的第一次尝试。

最佳答案

您需要返回Claims对象的生成器,而不是Claims对象。生成器实际上是可以返回声明对象的函数。我通常使用的方法是理解(其他人更喜欢flatMap,但是我认为阅读起来更清楚)。

  def genClaims: Gen[JwtClaims] = {
    for {
      url <- arbitrary[String]
      username <- arbitrary[String]
    } yield {
      val claims = new JwtClaims()
      claims.setNotBeforeMinutesInThePast(0)
      claims.setExpirationTimeMinutesInTheFuture(60)
      claims.setSubject(username)
      claims
    }
  }

10-04 13:14