如何嘲笑含有CQ5标签的CQ5 Page对象

问题描述 投票:0回答:3

我有,我想运行JUnit测试的方法。我嘲笑使用JMockit的CQ5页面。

我的测试方法是这样的

@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当我运行测试;然而,要测试的方法可以正常工作在真实的情景。

我怀疑我不是设置/嘲讽PageManager正确的,因此,我testTagnull

如何正确地嘲笑这让我要找的输出?

junit cq5 aem jmockit
3个回答
2
投票

你得到从反面这种测试。在模拟考试的方式(通常是 - 我从来没有与jmockit专门工作)工作,你创建一个空白的对象,它作为一个骗子。这个骗子是不是真正的PageManager中 - 它只是充当一个,并介绍了自己作为一个随时问。当有人问那个冒名顶替做一些事情(比如调用它的方法),冒名顶替者不知道该怎么办,所以它什么都不做并返回null。但是,你可以告诉冒名顶替者如何在特定情况下的行为。也就是说,你可以告诉它,当一个方法被调用做什么。

在你的情况,你并不需要创建实际的标签测试方法 - 你只需要模拟一个页面对象,当被问及为它的标签,将返回包含一个嘲笑标签的数组,这反过来,当问它的标题,将与你真正想要在你的测试中使用的标题作出回应。

我不知道jmockit,所以我不能提供任何代码段。然而,这并不是严格连接到CQ5 / AEM一个一般性的问题


0
投票

你可能无法找到您要嘲笑所有对象的任何“二传手”的方法,这是不是反正嘲笑正确的做法。

如提到的,最好的办法是使用嘲笑页。您可以使用预期类(mockit.Expectations)嘲笑通过在物体的某些方法返回的值。

看到在MockedClass类嘲笑一个“SlingHttpServletRequest”对象的这个实例。

@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");
    }

以类似的方式,你可以模拟其他的目的和他们的期望值。


0
投票

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

我遇到了同样的问题。为了解决标签,他们必须在/content/cq:tags/your/tag/etc/tags(传统)的存在。

页面#getTags实现使得以TagManager#getTags呼叫这反过来又尝试解析回购实际的标签资源。既然你在AEM上下文中进行测试时,必须加载在适当的位置,这些标签的MockTagManager来解决这些问题。

这意味着,你只需要像你加载你的资源(通过JSON)将自己的代码加载到AEM测试环境。

看看在AEM-模拟TagManager IMPL这里:WCM-IO测试/ MockTagManager.java在发展·WCM-IO / WCM-IO测试·GitHub的开始与resolve方法和调试自己的方式来找出你需要添加这些标签。

© www.soinside.com 2019 - 2024. All rights reserved.