Groovy断言包含失败,即使我可以看到列表中的项目

时间:2013-10-30 16:27:46

标签: groovy

Groovy断言包含:

assert testList.contains(4)
   |        |
   |        false
   [1, 2, 6, 3, 4]

我疯了吗?

这是测试代码:

    List testList = tester.getFactors(12)
    assert testList.size() == 5
    assert testList.contains(1)
    assert testList.contains(2)
    assert testList.contains(3)
    assert testList.contains(4)
    assert testList.contains(6)

如果我删除除contains(4)和contains(6)之外的所有内容,则它们中的任何一个或两个都会失败。

这是getFactors方法:

 List getFactors(int number)
     {
      def retList = new ArrayList();
      (1..Math.sqrt(number)).each() { i ->
       if(number % i == 0)
       {
           //add both the number and the division result
            retList.add(i) 
            if(i>1)
                retList.add(number / i)
       }
    }
    retList;
}

任何想法都非常感激。

1 个答案:

答案 0 :(得分:6)

如果你这样做:

println getFactors( 12 )*.class.name

你可以看到:

[java.lang.Integer, java.lang.Integer, java.math.BigDecimal, java.lang.Integer, java.math.BigDecimal]

所以64BigDecimal个实例,而不是Integer个实例

所以contains失败了(因为您正在寻找Integer(6)而不是BigDecimal(6)

如果你改变:

            retList.add(number / i)

为:

            retList.add(number.intdiv( i ) )

然后你的结果将保持为整数,你的断言应该起作用: - )

顺便说一下,只是为了好玩,你的功能可以改写为:

List getFactors( int number ) {
    (1..Math.sqrt(number)).findAll { i -> number % i == 0 }
                          .collectMany { i ->
                              if( i > 1 ) {
                                  [ i, number.intdiv( i ) ]
                              }
                              else {
                                  [ i ]
                              }
                          }
}