【问题标题】:How to test that a created value is unique?如何测试一个创造的价值是独一无二的?
【发布时间】:2014-05-02 01:08:53
【问题描述】:

在我的 Java 类中,我有一个方法可以创建一个对象并实现某些逻辑以将随机值分配给它的一些变量,使用 Random 的一个静态实例 (static Random rn = new Random();)。这些变量之一是objectId

如何编写 Spock 单元测试来验证 objectId 值是否在所有创建的对象中是唯一的

如果我只需要 两个连续的对象我会写这样的东西(省略导入):

class MyTest extends Specification {

    def @Shared obj = new MyObject()

    def "consecutive IDs are not equal"() {
        given:
            def id1 = ar.randomObject(MyObject.rn).getId()
            def id2 = ar.randomObject(MyObject.rn).getId()
        expect:
            id1 != id2

    }
} 

如何将此逻辑扩展到可变数量的实例?

【问题讨论】:

  • 你无法测试它总是独一无二的。使用 Random 生成 id 不是一个好主意
  • 确实,对于足够大的 id 集,它并不总是唯一的
  • @tim_yates 是的。这实际上是测试的目的。我对 10,000 个 ID 没问题,并保证在 100,000 个时失败。

标签: java unit-testing groovy spock


【解决方案1】:

这个怎么样? 给定一个测试类:

class Test {
    static Random r = new Random()
    Long objectId = r.nextLong()
}

//Test Case
def "consecutive IDs are not equal"() {
    given: "20 ids from 20 Test Objects"
        def ids = (1..20).collect { new Test().objectId }

    expect: "ids are unique"
        // use unique(false) not to mutate the list
        ids.unique(false) == ids
}

【讨论】:

  • 谢谢。通过解读你的答案,我学到了很多东西。
  • 太棒了。很高兴这很有帮助。 :) @PM77-1
【解决方案2】:

恐怕我的 groovy 不能胜任这项任务,但逻辑是:

def ids as Set

def "IDs are not duplicated"() {
  expect:
    ids.contains(id) == false

  cleanup:
    ids.add(id)

  where:
    id << listOfAllIds()
}

也就是说:断言每个 id 当前都不知道。当断言没有失败时,记录当前已知的id。

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2012-10-08
    相关资源
    最近更新 更多