2

我更新了我的问题,删除了旧文本以使其更易于阅读。

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
4

2 回答 2

4

这是 Scala 的表达式解析(半列推理)和 specs2 建模匹配器的方式的问题。

第一个匹配器的行product1 must not beNull被解释为product1.must(not) beNull. 这意味着它beNull处于不带参数的方法调用的位置,但如果它有参数,它们必须是 type Matcher[Product]。这是因为整个表达式是类型MatchResult[Product]的,并且MatchResulttrait 有一个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 中添加对该方法潜在问题的描述。

于 2013-04-28T22:37:18.453 回答
1

我猜:

  1. 导入名称冲突,或
  2. 规格中有问题

也许下面的验收测试示例可能会提供一个线索:

导入 org.specs2.Specification
 import xyz.{Product => TestProduct} // <- 为“Product”包命名

特征 MyTestHelper { val pId = "123" lazy val product = new TestProduct.Product(pId, ...) // <-- 要测试的类 }

类 MyTest 使用 MyTestHelper { def is = 扩展规范 (“产品应该是” + pId)!product.ProductID 必须是_==("123") ^ 结尾 }

于 2013-04-28T16:47:45.967 回答