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