在我的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
}
}
如何将此逻辑扩展到可变数量的实例?
答案 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记录为当前已知的。