Spock:尝试比较两个BigDecimal数组时发出警告

时间:2018-01-06 13:08:40

标签: intellij-idea groovy spock

我正在测试我的程序。特别是,我需要比较两个public bool doable = false; private void OnTriggerStay2D(Collider2D collision) { if (collision.CompareTag("Platform")) { doable = true; } } 数组:

BigDecimal

IntelliJ IDEA报告警告:

def "compare two BigDecimal arrays"(){
  given:
  BigDecimal[] c = [2, 3]
  expect:
  c == [2,3] as BigDecimal[]
}

此检查报告具有不兼容类型的分配。

DefaultGroovyMethods 中,我找到了以下方法:

'equals' in 'org.codehaus.groovy.runtime.DefaultGroovyMethods' cannot be applied to '(java.math.BigDecimal[])' less... (Ctrl+F1) 

然后,我想,它可以做到:

static boolean equals(java.lang.Object[] left, java.util.List right)

但现在出现以下警告:

def "compore BigDecimal[] and List<BigDecimal>"(){
  given:
  BigDecimal[] c = [2, 3]
  expect:
  c == [2,3]
}

所以,我的问题是:进行'==' between objects of inconvertible types 'BigDecimal[]' and 'List<Integer>' less... (Ctrl+F1) Reports calls to .equals() and == operator usages where the target and argument are of incompatible types. While such a call might theoretically be useful, most likely it represents a bug 比较的正确方法是什么,以便没有报告任何警告?

备注:即使报告了警告,两次测试都没有任何问题。

1 个答案:

答案 0 :(得分:2)

我猜这个问题是因为IDE看到了两个不同的问题。首先,当使用.equals()方法或.equals()运算符比较两个不兼容的类型时,它引用Java ==方法。情况如下:

c == [2, 3] // BigDecimal[] == List<Integer>

enter image description here

接下来,如果您满足IDE的兼容类型,那么不兼容的类型分配检查跳转并报告警告,因为IDE足够聪明,可以应用DefaultGroovyMethods.equals()替代,但它无法找到满足参数DefaultGroovyMethods.equals(BigDecimal[] a, BigDecimal[] b)

的方法

enter image description here

在IDE中至少有两种方法可以消除此警告:

1)您可以直接使用DefaultGroovyMethods.equals(c, [2,3]),例如:

def "compare BigDecimal[] and List<BigDecimal> (1)"(){
    given:
    BigDecimal[] c = [2, 3]

    expect:
    DefaultGroovyMethods.equals(c, [2,3])
}

2)或者您可以通过向方法添加@SuppressWarnings("GrEqualsBetweenInconvertibleTypes")来抑制此警告(如果您还有其他方法也会生成相同的警告,则可以添加测试类):

@SuppressWarnings("GrEqualsBetweenInconvertibleTypes")
def "compare BigDecimal[] and List<BigDecimal> (2)"(){
    given:
    BigDecimal[] c = [2, 3]

    expect:
    c == [2,3]
}

第二个选项允许您使用c == [2,3]比较而没有IDE警告,这是您所期望的。