我已经更新了我的问题,删除了旧文本以使其更容易阅读。
scalaVersion := "2.10.1"
"org.specs2" %% "specs2" % "1.13" % "test"我的spec2测试:
package com.mycompany.dataminer.parser
import org.specs2.mutable.Specification
case class Product(productID:String)
class SimpleTest extends Specification {
"product" should {
"have id = 123" in {
var product1 = Product("123")
product1 must not beNull
product1.productID must_== "123"
var product2 = Product("123")
product2 must not beNull
product2.productID must_== "123"
var product3 = Product("123")
product3 must not beNull
product3.productID must_== "123"
}
}
}结果:
scala: type mismatch;
found : String
required: org.specs2.matcher.Matcher[com.mycompany.dataminer.parser.Product]
product1.productID must_== "123"
^一旦我写了这段代码,它就可以工作了,直到我添加了下面这几行:
product1 must not beNull
product2 must not beNull
product3 must not beNull发布于 2013-04-29 06:37:18
这是Scala的表达式解析(半列推断)和specs2对匹配器建模的方式的问题。
具有第一个匹配器的行product1 must not beNull被解释为product1.must(not) beNull。这意味着beNull处于没有参数的方法调用的位置,但是如果它有参数,那么它们必须是Matcher[Product]类型。这是因为整个表达式都是MatchResult[Product]类型,并且MatchResult特征有一个apply方法。
结果是Scala推断第一行表达式的参数在第二行,product1.productID的类型是String,这是意外的。
对于这种情况,有3种解决方法:
product1不能beNull product1.productID must_== "123"
product1不能beNull;product1.productID must_== "123"
notproduct1不能(BeNull) product1.productID must_== "123"
这将在下一个specs2版本中得到缓解,方法是将MatchResult[T].apply方法设置为私有,以便将编译错误转换为method apply in trait MatchResult cannot be accessed in org.specs2.matcher.MatchResult[Product],并在Scaladoc中添加对此方法的潜在问题的描述。
https://stackoverflow.com/questions/16264269
复制相似问题