Sling Model Unit Testing | Community
Skip to main content
July 25, 2023
Solved

Sling Model Unit Testing

  • July 25, 2023
  • 2 replies
  • 3578 views

I created a Sling Model class for my component to get the root page and access all the child pages of that root page. Then how to do a unit testing for my sling model by using Junit5 and AEM Mocks.

 

 

 

 

 

 

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 Ekhlaque

Hi @nats ,

 

Here is the approach which you can go through step by step to do unit testing for the sling model by using Junit5 and AEM Mocks . 

 

->Make sure your project is set up with the necessary dependencies for JUnit 5 and AEM Mocks. You can add the required dependencies to your project's Maven or Gradle build file.
->Ensure that your Sling Model class is implemented correctly and has the necessary logic to retrieve the root page and access child pages.
->Create a JUnit 5 test class for your Sling Model. This class will be responsible for testing the behavior of your Sling Model.
->In your test class, use AEM Mocks to set up a mock AEM environment that simulates the AEM context. This includes mock requests, resource resolver, and other AEM-specific objects.
->Set up a mock AEM page structure with a root page and child pages that your Sling Model will use during testing.
->Write test methods in your test class to test the behavior of your Sling Model. Use JUnit 5 assertions to verify that the Sling Model behaves as expected.

Sharing an example of how to write a simple unit test for a Sling Model that retrieves child pages under a root page.

Assuming you have the following Sling Model class that retrieves child pages:

@Model(adaptables = SlingHttpServletRequest.class) public class MyComponentModel { @Inject private PageManager pageManager; private List<Page> childPages; @PostConstruct protected void init() { // Get the root page (assumed to be the current page in this example) Page currentPage = pageManager.getContainingPage(request.getResource()); // Get the child pages of the root page childPages = currentPage.getChildren(); } public List<Page> getChildPages() { return childPages; } }

 

->let's create a test class for this Sling Model.

import io.wcm.testing.mock.aem.junit5.AemContext; import org.apache.sling.api.SlingHttpServletRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Reference; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @ExtendWith(AemContextExtension.class) public class MyComponentModelTest { private MyComponentModel myComponentModel; @BeforeEach void setUp(AemContext context, SlingHttpServletRequest request) { // Set up your mock AEM context // Example: Set up a mock page structure with a root page and child pages Page rootPage = context.create().page("/content/mysite"); context.create().page(rootPage, "child1"); context.create().page(rootPage, "child2"); // Create an instance of your Sling Model myComponentModel = new MyComponentModel(); myComponentModel.pageManager = mock(PageManager.class); // Set up mock behavior for PageManager to return the root page when(myComponentModel.pageManager.getContainingPage(request.getResource())).thenReturn(rootPage); } @Test void testGetChildPages() { // Call the init() method to trigger the retrieval of child pages myComponentModel.init(); // Get the list of child pages from the Sling Model List<Page> childPages = myComponentModel.getChildPages(); // Assert that the list of child pages is not null and contains the expected number of pages assertNotNull(childPages); assertEquals(2, childPages.size()); } }

 

Hope this helps !

2 replies

Ekhlaque
Adobe Employee
EkhlaqueAdobe EmployeeAccepted solution
Adobe Employee
July 25, 2023

Hi @nats ,

 

Here is the approach which you can go through step by step to do unit testing for the sling model by using Junit5 and AEM Mocks . 

 

->Make sure your project is set up with the necessary dependencies for JUnit 5 and AEM Mocks. You can add the required dependencies to your project's Maven or Gradle build file.
->Ensure that your Sling Model class is implemented correctly and has the necessary logic to retrieve the root page and access child pages.
->Create a JUnit 5 test class for your Sling Model. This class will be responsible for testing the behavior of your Sling Model.
->In your test class, use AEM Mocks to set up a mock AEM environment that simulates the AEM context. This includes mock requests, resource resolver, and other AEM-specific objects.
->Set up a mock AEM page structure with a root page and child pages that your Sling Model will use during testing.
->Write test methods in your test class to test the behavior of your Sling Model. Use JUnit 5 assertions to verify that the Sling Model behaves as expected.

Sharing an example of how to write a simple unit test for a Sling Model that retrieves child pages under a root page.

Assuming you have the following Sling Model class that retrieves child pages:

@Model(adaptables = SlingHttpServletRequest.class) public class MyComponentModel { @Inject private PageManager pageManager; private List<Page> childPages; @PostConstruct protected void init() { // Get the root page (assumed to be the current page in this example) Page currentPage = pageManager.getContainingPage(request.getResource()); // Get the child pages of the root page childPages = currentPage.getChildren(); } public List<Page> getChildPages() { return childPages; } }

 

->let's create a test class for this Sling Model.

import io.wcm.testing.mock.aem.junit5.AemContext; import org.apache.sling.api.SlingHttpServletRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Reference; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @ExtendWith(AemContextExtension.class) public class MyComponentModelTest { private MyComponentModel myComponentModel; @BeforeEach void setUp(AemContext context, SlingHttpServletRequest request) { // Set up your mock AEM context // Example: Set up a mock page structure with a root page and child pages Page rootPage = context.create().page("/content/mysite"); context.create().page(rootPage, "child1"); context.create().page(rootPage, "child2"); // Create an instance of your Sling Model myComponentModel = new MyComponentModel(); myComponentModel.pageManager = mock(PageManager.class); // Set up mock behavior for PageManager to return the root page when(myComponentModel.pageManager.getContainingPage(request.getResource())).thenReturn(rootPage); } @Test void testGetChildPages() { // Call the init() method to trigger the retrieval of child pages myComponentModel.init(); // Get the list of child pages from the Sling Model List<Page> childPages = myComponentModel.getChildPages(); // Assert that the list of child pages is not null and contains the expected number of pages assertNotNull(childPages); assertEquals(2, childPages.size()); } }

 

Hope this helps !

BrianKasingli
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
July 26, 2023

If you take a look at this detailed 1 hour tutorial on how to setup AEM mocks for your JUNIT5 project, it should demystify your confusion about AEM sling models unit tests, and how to actually do it.
https://www.youtube.com/watch?v=g5x6F8bUHj8&ab_channel=AEMGEEKS

If you search for youtube tutorials for this topic, you should be able to educate yourself and learn more about how this is done.