AemMock in JUnit4 is not able to return page.getTemplate | Community
Skip to main content
Level 2
October 26, 2020

AemMock in JUnit4 is not able to return page.getTemplate

  • October 26, 2020
  • 0 replies
  • 1155 views

I am trying to run the test for one of my Model class for Custom Render Condition. Its testing if current is a template allowed to show the tab/field in dialog. When I am running test for this code using AemMock and JUnit4 its failing when debug I found its not able to get template from the page object: 

 

final Template pageTemplate = page.getTemplate(); //The above, getTemplate returns null for my Unit test below templatePathOfCurrentPage = pageTemplate.getName();

 

But at the same time if I change the code for getting the template with Resource API it works perfectly fine:

 

Resource pageResource = page.getContentResource(); templatePathOfCurrentPage = pageResource.getValueMap().get("cq:template", String.class);

 

Any pointer on this or suggestion to solve this will highly appreciated.

 

This is my Unit test:

 

package com.abc.models; import com.adobe.cq.sightly.WCMBindings; import com.adobe.granite.ui.components.rendercondition.RenderCondition; import com.adobe.granite.ui.components.rendercondition.SimpleRenderCondition; import com.abc.AppAemContext; import com.day.cq.wcm.api.PageManager; import com.day.cq.wcm.api.WCMException; import io.wcm.testing.mock.aem.junit.AemContext; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.scripting.SlingBindings; import org.apache.sling.models.factory.ModelFactory; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import static org.junit.Assert.assertFalse; @RunWith(MockitoJUnitRunner.class) public class TemplateTypeRenderConditionTest { private static final String DEST_ROOT = "/content/sample/abc"; private static final String TEMPLATE_PATH = "/conf/abc/settings/wcm/templates/homepage"; private static final String PAGE_ROOT = "/content/sample/abc/index"; public final AemContext CONTEXT = AppAemContext.newAemContext(); @Mock PageManager pageManager; SlingHttpServletRequest request; SlingBindings slingBindings; @Before public void setUp() throws NoSuchFieldException, WCMException { slingBindings = (SlingBindings) CONTEXT.request().getAttribute(SlingBindings.class.getName()); slingBindings.put(WCMBindings.PAGE_MANAGER, pageManager); slingBindings.put(SlingBindings.RESOURCE, CONTEXT.resourceResolver().getResource(DEST_ROOT)); // prepare sling request CONTEXT.request().setAttribute(SlingBindings.class.getName(), slingBindings); CONTEXT.request().setResource(CONTEXT.resourceResolver().getResource(DEST_ROOT)); CONTEXT.pageManager().create(DEST_ROOT, "index", TEMPLATE_PATH, "title1"); } public void itShouldReturnTheResourceMatchesTheTemplateTypeFromItemParamter() throws WCMException { CONTEXT.request().setQueryString("item="+PAGE_ROOT); CONTEXT.getService(ModelFactory.class).createModel(CONTEXT.request(), TemplateTypeRenderCondition.class); final SimpleRenderCondition resultingRenderCond = (SimpleRenderCondition) CONTEXT.request().getAttribute(RenderCondition.class.getName()); assert(resultingRenderCond.check()); } }

 

Apps AEM Context setup:

 

package com.abc.models; import com.adobe.acs.commons.models.injectors.impl.AemObjectInjector; import com.abc.models.TemplateTypeRenderCondition; import io.wcm.testing.mock.aem.MockAemAdapterFactory; import io.wcm.testing.mock.aem.junit.AemContext; import io.wcm.testing.mock.aem.junit.AemContextCallback; import org.apache.sling.api.adapter.AdapterFactory; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.testing.mock.sling.ResourceResolverType; import java.io.IOException; public class AppAemContext { private static final String DEST_ROOT = "/content/sample/abc"; private static final String TEST_JSON = "/templatetyperendercondition/test-content.json"; public static AemContext newAemContext() { return new AemContext(new SetUpCallback(), ResourceResolverType.JCR_MOCK); } private static final class SetUpCallback implements AemContextCallback { public void execute(AemContext context) throws PersistenceException, IOException { // application-specific services for unit tests context.registerService(AdapterFactory.class, new MockAemAdapterFactory()); context.registerService(new AemObjectInjector()); // register models from package context.addModelsForPackage("com.abc.models"); context.load().json(TEST_JSON, DEST_ROOT); } } }

 

 

This is my class and test fixture for PoM  below:

 

package com.abc.models; import com.adobe.granite.ui.components.rendercondition.RenderCondition; import com.adobe.granite.ui.components.rendercondition.SimpleRenderCondition; import com.day.cq.wcm.api.Page; import com.day.cq.wcm.api.PageManager; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.injectorspecific.ScriptVariable; import org.apache.sling.models.annotations.injectorspecific.Self; import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; @Model(adaptables = SlingHttpServletRequest.class) public class TemplateTypeRenderCondition { private final Logger logger = LoggerFactory.getLogger(TemplateTypeRenderCondition.class); private SlingHttpServletRequest request; @ScriptVariable private PageManager pageManager; @ValueMapValue private String[] templatePath; @PostConstruct public void init() { // Get the resource page path for which propery is being edited final String pathPage = request.getParameter("item"); //Assign suffix as path for Create Page wizard final String suffix = request.getRequestPathInfo().getSuffix();; // Still cannot found the through exception if (pathPage == null && suffix == null) { throw new IllegalArgumentException("Could not determine page from <" + request.getPathInfo() + "> , neither suffix in create page wizard or, item in editor"); } logger.info("Path Info for the page property editing from RenderCondition is {}", request.getPathInfo()); String templatePathOfCurrentPage = null; if(pathPage != null) { final Page page = pageManager.getPage(pathPage); if (page == null) { throw new IllegalArgumentException("Resource at <" + pathPage + "> is not a page"); } //final Template pageTemplate = page.getTemplate(); Resource pageResource = page.getContentResource(); templatePathOfCurrentPage = pageResource.getValueMap().get("cq:template", String.class); } else if( suffix != null){ templatePathOfCurrentPage = suffix; } // Check if we have the template from page if(templatePath.length < 1) { throw new IllegalArgumentException("Could not get page template match from <" + request.getPathInfo() + ">"); } final List<String> listTemplates = Arrays.asList(templatePath); final boolean show = listTemplates.contains(templatePathOfCurrentPage); // Add the render condition based on check if list of templatePath has current page template allowed request.setAttribute(RenderCondition.class.getName(), new SimpleRenderCondition(show)); } public String[] getTemplatePath(){ return templatePath; } } <!-- test dependencies --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>junit-addons</groupId> <artifactId>junit-addons</artifactId> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.api</artifactId> <version>2.18.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.adapter</artifactId> <version>2.1.6</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.jcr.api</artifactId> <version>2.4.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.jcr.resource</artifactId> <version>3.0.18</version> <scope>test</scope> </dependency> <!-- for testing we need the new ResourceTypeBasedResourcePicker --> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.models.impl</artifactId> <version>1.4.12</version> <scope>test</scope> </dependency> <!-- Added for Powemock --> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito-common</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-easymock</artifactId> <version>1.5.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.osgi-mock</artifactId> <version>2.4.14</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.jcr-mock</artifactId> <version>1.4.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.resourceresolver-mock</artifactId> <version>1.1.26</version> <scope>test</scope> </dependency> <dependency> <groupId>io.wcm</groupId> <artifactId>io.wcm.sling.commons</artifactId> <version>1.3.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.sling-mock.junit4</artifactId> <version>2.4.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.sling-mock-oak</artifactId> <version>2.1.6</version> <scope>test</scope> </dependency> <dependency> <groupId>io.wcm</groupId> <artifactId>io.wcm.testing.aem-mock.junit4</artifactId> <version>3.0.0</version> <scope>test</scope> </dependency>

 

 

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.