gpt4 book ai didi

Scala spec2 object.productID must_== "123"失败

转载 作者:行者123 更新时间:2023-12-02 05:06:14 26 4
gpt4 key购买 nike

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

最佳答案

这是 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"
  • 带括号的不是

    product1 must not(beNull)

    product1.productID must_== "123"

这将在下一个 specs2 版本中通过将 MatchResult[T].apply 方法设为私有(private)来缓解,以便将编译错误转换为 method apply in trait MatchResult cannot be accessed in org.specs2.matcher.MatchResult[Product] 并在此方法的 Scaladoc 中添加潜在问题的描述。

关于Scala spec2 object.productID must_== "123"失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16264269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com