如何在CQ5中的Spock框架中模拟ValueMap?

时间:2018-03-07 05:57:36

标签: aem cq5 spock

我正在使用Spock框架为CQ5项目编写单元测试用例。

 def  props1 = Mock(ValueMap)
    props1.put("prop1",21);
    props1.put("prop2",92);

我无法向props1添加属性。

2 个答案:

答案 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。

文档:

https://helpx.adobe.com/experience-manager/6-3/sites/developing/using/reference-materials/javadoc/org/apache/sling/api/wrappers/ValueMapDecorator.html

https://helpx.adobe.com/experience-manager/6-3/sites/developing/using/reference-materials/javadoc/org/apache/sling/api/wrappers/ModifiableValueMapDecorator.html

答案 1 :(得分:0)

好吧,我只是休息一下,需要别的东西来思考,所以我为你做了一个快速的例子。但在我们查看代码之前,解释为什么您无法在put(..)上调用Mock(ValueMap):仅仅因为界面ValueMap只有get(..)方法。因此,您有两种使用ValueMap进行测试的方式:

  1. 使用 Jens 建议的真实对象。如何使用他建议的ValueMapDecorator可以在我的第一个特征方法中看到。

  2. 使用Mock(ValueMap)或者甚至更好的Stub(ValueMap),并在使用测试期间使用的值调用get(..)方法时指定(存根)其行为。这样您就不需要使用值填充真实对象并使用具体类,而只需告诉存根接口如何表现。

  3. 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
      }
    }