junit with AemContextExtension | Community
Skip to main content
Level 3
May 3, 2020
Solved

junit with AemContextExtension

  • May 3, 2020
  • 3 replies
  • 11494 views

Hi I am trying to write junit using aem context for the first time, below is my sample sling model class.

 

@Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class HeadlineModel {
private static final Logger LOGGER = LoggerFactory.getLogger(HeadlineModel.class);
@ValueMapValue
@Optional
private String size;
@ValueMapValue
@Optional
private String alignment;
@ValueMapValue
@Optional
private String headlinetext;
@ValueMapValue
@Optional
private String scheme;

public String getSize() {
return size;
}

public String getAlignment() {
return alignment;
}

public String getHeadlinetext() {
return headlinetext;
}

public String getScheme() {
return scheme;
}
}

Could someone give example to mock the above getters with latest way of using aemcontext

 

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

I have given an example how to unittest a sling model at https://cqdump.wordpress.com/2019/01/17/writing-unittests-for-aem-part-3-mocking-resources/, it should answer your questions.

 

Jörg

3 replies

BrianKasingli
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
May 4, 2020

@srikanthg212933,

Sure. There are really good resources online that should help you get started. Try here https://sourcedcode.com/category/aem/junit4

Original Blog: https://sourcedcode.com/aem-sling-models-unit-test-junit-4-with-examples

 

Header.class

package com.sourcedcode.core.models; import com.day.cq.wcm.api.Page; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.models.annotations.DefaultInjectionStrategy; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.injectorspecific.ChildResource; import org.apache.sling.models.annotations.injectorspecific.ScriptVariable; import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; import javax.annotation.PostConstruct; import javax.inject.Inject; @Model(adaptables = Resource.class, resourceType = Header.RESOURCE_TYPE, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) public class Header { protected static final String RESOURCE_TYPE = "sourcedcode/components/structure/header"; @ValueMapValue private String contactUsPath; @ScriptVariable(name="currentPage") private Page currentPage; @ChildResource(name="link") Resource childResource; @SlingObject private ResourceResolver resolver; private String contactUsPageSecretChar; @PostConstruct public void init() { setContactUsPageSecretChar(); } private void setContactUsPageSecretChar() { Resource resource = resolver.getResource(contactUsPath); if (resource != null) { Page contactUsPage = resource.adaptTo(Page.class); contactUsPageSecretChar = contactUsPage.getTitle(); } } public String getContactUsPageSecretChar() { return contactUsPageSecretChar.substring(contactUsPageSecretChar.length() - 1); } // demo of testing the @ScriptVariable("currentPage") annotation public String getPageTitle() { return currentPage.getPageTitle(); } // demo of testing the @ChildResource annotation public String getChildLinkPropFlag() { return childResource.getValueMap().get("flag", ""); } }

HeaderTest.class

package com.sourcedcode.core.models; import com.adobe.cq.commerce.common.ValueMapDecorator; import com.day.cq.wcm.api.Page; import com.google.common.collect.ImmutableMap; import io.wcm.testing.mock.aem.junit.AemContext; import org.apache.sling.api.resource.Resource; import org.apache.sling.testing.mock.sling.ResourceResolverType; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import static junitx.framework.Assert.assertEquals; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class HeaderTest { @Rule public final AemContext context = new AemContext(ResourceResolverType.JCR_MOCK); // the context.resourceResolver() is auto injected by the AemContext, cannot be mocked. // ResourceResolver resolver; // mocking the global AEM object "currentPage". // variable does not need to match the variables in the underTest.class @Mock private Page currentPage; // injects all the mocks into the tested object. @InjectMocks private Header underTest; @Test public void itShouldReturnTheCorrectSecretCharWhenResourceExist() { // using the AEM context to create an AEM resource in the context, to set properties for the resource. // the resource path can be anything made up. Resource headerResourceContext = context.create().resource("/content/sourcedcode/home/jcr:content/header", new ValueMapDecorator(ImmutableMap.<String, Object> of( "contactUsPath", "/content/sourcedcode/contact", "anotherProperty", "example"))); // create mock page, resolved by the resolver. context.create().page("/content/sourcedcode/contact", "", ImmutableMap.<String, Object>builder() .put("jcr:title", "Contact Us Page") .build()); underTest = headerResourceContext.adaptTo(Header.class); assertEquals("e", underTest.getContactUsPageSecretChar()); } @Test public void itShouldReturnTheCorrectCurrentPageTitle() { when(currentPage.getPageTitle()).thenReturn("Home Page"); assertEquals("Home Page", underTest.getPageTitle()); } @Test public void itShouldReturnTheCorrectChildLinkProperty() { context.build().resource("/content/sourcedcode/home/jcr:content/header") .siblingsMode() .resource("link", "flag", "newPage"); underTest = context.resourceResolver().getResource("/content/sourcedcode/home/jcr:content/header").adaptTo(Header.class); assertEquals("newPage", underTest.getChildLinkPropFlag()); } }
joerghoh
Adobe Employee
joerghohAdobe EmployeeAccepted solution
Adobe Employee
May 4, 2020

I have given an example how to unittest a sling model at https://cqdump.wordpress.com/2019/01/17/writing-unittests-for-aem-part-3-mocking-resources/, it should answer your questions.

 

Jörg

santhosh_kumark
Level 6
October 16, 2020

Hi @srikanthg212933 ,

 

You can refer the sample hello world test class to achieve this.

@ExtendWith(AemContextExtension.class)
class HelloWorldModelTest {

private HelloWorldModel hello;

private Page page;
private Resource resource;

@BeforeEach
public void setup(AemContext context) throws Exception {

// prepare a page with a test resource
page = context.create().page("/content/mypage");
resource = context.create().resource(page, "hello",
"sling:resourceType", "myproject/components/content/helloworld");

// create sling model
hello = resource.adaptTo(HelloWorldModel.class);
}

@Test
void testGetMessage() throws Exception {
// some very basic junit tests
String msg = hello.getMessage();
assertNotNull(msg);
assertTrue(StringUtils.contains(msg, resource.getResourceType()));
assertTrue(StringUtils.contains(msg, page.getPath()));
}

}

 

Regards,

Santosh