我已更新了我的问题,删除旧文字以便于阅读。
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
答案 0 :(得分:4)
这是Scala的表达式解析(半列推断)以及specs2模型匹配的方式的问题。
第一个匹配器product1 must not beNull
的行被解释为product1.must(not) beNull
。这意味着beNull
处于没有参数的方法调用的位置,但如果它有参数,则它们必须是Matcher[Product]
类型。这是因为整个表达式的类型为MatchResult[Product]
,而MatchResult
特征具有apply
方法。
结果是Scala推断出第一行表达式的参数位于第二行product1.productID
并且类型为String
,这是意外的。
这种情况有3种解决方法:
换行符
product1 must not beNull
product1.productID must_== "123"
半列
product1 must not beNull;
product1.productID must_== "123"
一个括号not
product1 must not(beNull)
product1.productID must_== "123"
这将在下一个specs2版本中通过将MatchResult[T].apply
方法设为私有来减轻,以便将编译错误转换为method apply in trait MatchResult cannot be accessed in org.specs2.matcher.MatchResult[Product]
,并在此方法的Scaladoc中添加潜在问题的描述。
答案 1 :(得分:1)
我的猜测:
以下验收测试示例可能提供了一个线索:
import org.specs2.Specification import xyz.{Product => TestProduct} // <- Alias the "Product" packagetrait MyTestHelper { val pId = "123" lazy val product = new TestProduct.Product(pId, ...) // <-- Class to test }
class MyTest extends Specification with MyTestHelper { def is = ("Product should be " + pId) ! product.ProductID must be_==("123") ^ end }