我有一个方法可以运行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
,因此,我的PageManager
是testTag
如何正确模拟这个以获得我正在寻找的输出?
答案 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
方法开始并调试您的确定您需要在何处添加这些标签的方法。