我正在使用Spock框架为CQ5项目编写单元测试用例。
def props1 = Mock(ValueMap)
props1.put("prop1",21);
props1.put("prop2",92);
我无法向props1添加属性。
答案 0 :(得分:0)
我不熟悉Spock,但在Java测试中,您不需要模拟ValueMap
。幸运的是,有一种更好的方法可以使用ValueMap
创建org.apache.sling.api.wrappers.ValueMapDecorator
:
final Map<String, Object> properties = new HashMap<>();
properties.put("prop1", 21);
properties.put("prop2", 92);
final ValueMap valueMap = new ValueMapDecorator(properties);
也许你可以适应Spock。
文档:
答案 1 :(得分:0)
好吧,我只是休息一下,需要别的东西来思考,所以我为你做了一个快速的例子。但在我们查看代码之前,解释为什么您无法在put(..)
上调用Mock(ValueMap)
:仅仅因为界面ValueMap
只有get(..)
方法。因此,您有两种使用ValueMap
进行测试的方式:
使用 Jens 建议的真实对象。如何使用他建议的ValueMapDecorator
可以在我的第一个特征方法中看到。
使用Mock(ValueMap)
或者甚至更好的Stub(ValueMap)
,并在使用测试期间使用的值调用get(..)
方法时指定(存根)其行为。这样您就不需要使用值填充真实对象并使用具体类,而只需告诉存根接口如何表现。
package de.scrum_master.stackoverflow
import org.apache.sling.api.resource.ValueMap
import org.apache.sling.api.wrappers.ValueMapDecorator
import spock.lang.Specification
class SlingValueMapTest extends Specification {
def "Real ValueMap"() {
given:
Map<String, Object> map = new HashMap<>()
map.put("prop1", 21)
map.put("prop2", 92)
ValueMap valueMap = new ValueMapDecorator(map)
expect:
valueMap.get("prop1") == 21
valueMap.get("foo") == null
valueMap.get("prop2") == 92
valueMap.get("bar") == null
}
def "Stubbed ValueMap"() {
given:
ValueMap valueMap = Stub() {
get("prop1") >> 21
get("prop2") >> 92
get(_) >> null
}
expect:
valueMap.get("prop1") == 21
valueMap.get("foo") == null
valueMap.get("prop2") == 92
valueMap.get("bar") == null
}
}