使用ScalaCheck生成没有构造函数参数的对象

时间:2015-08-04 11:16:45

标签: java scala scalacheck

对于我的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。

1 个答案:

答案 0 :(得分:3)

您需要返回声明对象的生成器,而不是声明对象。生成器实际上是一个可以返回声明对象的函数。我这样做的正常方法是理解(其他人更喜欢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
    }
  }