如何模拟包含cq5标记的CQ5 Page对象

时间:2015-05-07 13:42:10

标签: junit cq5 aem jmockit

我有一个方法可以运行JUnit测试。我正在使用JMockit嘲笑cq5页面。

我的测试方法如下所示

public static void convert(String inputDate) throws ParseException {

        DateFormat format = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
        Date d = format.parse(inputDate); // example 1999-12-13 16:14:48
                System.out.println(d);
    }

要测试的实际方法是这样的: -

@Mocked
Page page;
@Mocked
PageManager pageManager;
Tag testTag = pageManager.createTag("someID","someTitle","someDescription");//i've left out the try catch for brevety
System.out.println(testTag.getTitle()); // always null here


public void testSomeMethod() {

    new Expectations() {
        // variables declared here are mocked by default
        {
            page.getProperties();
            propertyMap.put("cq:tags", testTag);
            returns(new ValueMapDecorator(propertyMap));
        }
    };
    String propertyValue = methodToBeTested(page);
    Assert.assertEquals(propertyValue, "someTitle");
}

当我运行测试时,它总是返回public static String getTopic(Page page) { String topic = null; Tag[] tags = page.getTags(); System.out.println(tags.size()); // returns 0 when I run the test. for (int i = 0; i < tags.length; i++) { Tag tag = tags[i]; topic = tag.getTitle(); } } return topic; } ;但是,要测试的方法在实际场景中可以正常工作。

我怀疑我没有正确设置/模拟null,因此,我的PageManagertestTag

如何正确模拟这个以获得我正在寻找的输出?

3 个答案:

答案 0 :(得分:2)

你从错误的一方开始进行这项测试。模拟(通常 - 我从未使用过jmockit)工作的方式是,你创建一个空白对象,充当冒名顶替者。这个冒名顶替者不是一个真正的PageManager - 它只是作为一个整体,并且每当被问及时自我介绍。当有人要求冒名顶替者做某事(比如调用它的方法)时,冒名顶替者不知道该怎么做,所以它什么都不做并且返回null。但是,您可以告诉冒名顶替者在某些情况下如何表现。也就是说,您可以告诉它在调用方法时该怎么做。

在你的情况下,你不需要创建实际的标签来测试该方法 - 你只需要模拟一个页面对象,当被要求它的标签时,它将返回一个包含模拟标签的数组,而这个标签反过来,当被问及它的标题时,将回答您实际想要在测试中使用的标题。

我不知道jmockit,所以我无法提供任何代码片段。然而,这是一个与CQ5 / AEM没有严格关联的一般性问题

答案 1 :(得分:0)

您可能无法找到任何&#39; setter&#39;您尝试模拟的所有对象的方法,这无论如何都不是正确的模拟方法。

提到的最好方法是使用模拟页面。您可以使用Expectations类(mockit.Expectations)来模拟对象中某些方法返回的值。

请参阅此示例模拟一个&#39; SlingHttpServletRequest&#39; MockedClass类中的对象。

@Test
    public void testMethod(@Mocked final SlingHttpServletRequest request){
        String indicator ;
        new Expectations() {
            {
                request.getParameter("archive");
                returns("true");
            }
        };

        indicator = OriginalClass.originalMethod(request);
        Assert.assertEquals(indicator, "true");
    }

以类似的方式,您可以模拟其他对象及其所需的值。

答案 2 :(得分:0)

我在这里回答了同样的问题:https://forums.adobe.com/thread/2536290

我遇到了同样的问题。为了解析代码,它们必须存在于/content/cq:tags/your/tag/etc/tags(旧)下。

Page#getTags实现对TagManager#getTags进行调用,后者依次尝试解析存储库中的实际标签资源。由于您是在AEM上下文中进行测试的,因此必须将这些标签加载到MockTagManager解析的适当位置。

这意味着您需要将标签加载到AEM测试上下文中,就像您通过json加载资源一样。

在此处查看aem-mock TagManager的实现:开发时的wcm-io-testing / MockTagManager.java·wcm-io / wcm-io-testing·GitHub以resolve方法开始并调试您的确定您需要在何处添加这些标签的方法。