也许一个例子是最好的开始:
def uri = new URI('http://example.com?query=abc&loc=US')
def parsed = uri.query.tokenize('&').collect { it.tokenize('=') }
println "parsed to list: $parsed"
println "count of 'loc' params: " + parsed.count { it.first() == 'loc' }
println "count of 'bob' params: " + parsed.count { it.first() == 'bob' }
println "count of params with value 'abc': " + parsed.count { it.last() == 'abc' }
打印:
$ groovy test.groovy
parsed to list: [[query, abc], [loc, US]]
count of 'loc' params: 1
count of 'bob' params: 0
count of params with value 'abc': 1
的问题,因为你正确地指出,就是你不能把你PARAMS到地图中,如果您的意图是计算具有某个名称的参数的数量。
在上面,我们将参数解析为内部列表是关键值对的列表。这样我们可以调用it.first()
来获取参数名称,并且it.last()
可以获得参数值。 groovy List.count { }
方法让我们可以计算params列表中某个项目的出现次数。
至于你的代码,你不需要在测试开始时调用new URI()
,因为你无论如何设置了这几行的值。
此外with(uri)
呼叫是不必要的,因为您不使用任何uri方法,无论如何都不用在uri.
之前加上前缀。即您可以写:
def uri = new URI('http://example.com?query=abc&loc=US')
def parsed = uri.query.tokenize('&').collect { it.tokenize('=') }
或:
def uri = new URI('http://example.com?query=abc&loc=US')
uri.with {
def parsed = query.tokenize('&').collect { it.tokenize('=') }
}
(注意,我们直接在第二个例子中使用query
)
,但没有太多的点与如果你是使用仍然以uri.
作为前缀。
得到的测试情况可能看起来像:
def "prepareURI"() {
given: "Search Object"
def uri = handler.prepareURI(properties) // it will return URI like http://example.com?query=abc&loc=US
when:
def parsed = query.tokenize('&').collect { it.tokenize('=') }
then:
assert parsed.count { it.first() == 'loc' } == 1
}
谢谢!我明白了。顺便提一下,URI api永远不允许重复的查询参数,如果我们试图放置相同的查询参数,它将采用最新的查询参数。 –