如何测试创建的值是否唯一?

时间:2014-05-02 01:08:53

标签: java unit-testing groovy spock

在我的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

    }
} 

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

我担心我的常规不能完成任务,但逻辑是:

def ids as Set

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

  cleanup:
    ids.add(id)

  where:
    id << listOfAllIds()
}

即:断言每个id目前都不知道。当断言没有失败时,将id记录为当前已知的。