Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.

AemMock in JUnit4 is not able to return page.getTemplate

Avatar

Level 1

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>

 

 

0 Replies