Team,
Could you please help me in creating the Junit test classes for Sling models and Sling servlets, currently we are using AEM 6.3.2 version and trying to create the test cases but we are getting Null for Resource, ResouceResolver and Request objects.
Please find the below code base and suggest me what is best approach to create the Junit test class using Mockito.
@Model(adaptables = { SlingHttpServletRequest.class,
Resource.class }, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class TestHeaderModel {
@SlingObject
private SlingHttpServletRequest slingRequest;
@Inject
@Via(MemberPortalDigitalConstants.RESOURCE)
ResourceResolver resourceResolver;
/** The dashboard path. */
@Inject
@Via(MemberPortalDigitalConstants.RESOURCE)
private static String dashboardPath;
/** The logo url. */
@Inject
@Via(MemberPortalDigitalConstants.RESOURCE)
private String logoUrl=StringUtils.EMPTY;
.
.
.
.
.
.
@PostConstruct
public void init() {
String currentPagePath = StringUtils.EMPTY;
if (slingRequest != null) {
currentPagePath = slingRequest.getPathInfo();
}
Page rootPage = getGlobalNavRootPage(resourceResolver);
if (rootPage != null) {
homePage = rootPage.getTitle();
}
try {
navList = getNavigationTree(rootPage);
} catch (Exception e) {
LOG.error("Exception occured while generating header navigation:::", e);
}
}
public static Page getGlobalNavRootPage(ResourceResolver resourceResolver) {
String navRootPage = StringUtils.EMPTY;
Page rootPage = null;
if (resourceResolver != null) {
if (StringUtils.isEmpty(navRootPage) && StringUtils.isNotEmpty(dashboardPath)) {
navRootPage = dashboardPath;
}
LOG.debug("Selected navRootPage is : " , navRootPage);
}
rootPage = CommonUtils.retrievePage(navRootPage, resourceResolver);
return rootPage;
}
private List<NavigationItems> getNavigationTree(final Page root) throws Exception {
LOG.debug("Inside getNavigationTree method of " , CLASS_NAME);
List<NavigationItems> navList = new ArrayList<NavigationItems>();
.
.
.
.
return navList;
}
}
Solved! Go to Solution.
Views
Replies
Total Likes
Hi,
i've used Mockito a lot of time ago.
In my case i just only apply the annotation @Mock on top of the element that i need to mock.
@Mock
Resource resource;
@Mock
Node node;
@Mock
NodeIterator nodeItr;
@Mock
Session session;
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
Probably you need to identify the method that you want to test and than mock the element that you need.
By reading your model, i don't find a lot of element to test just because your method have a very large purpose.
Let me know if you need some specific details.
Thanks,
Antonio
Views
Replies
Total Likes
Hi,
i've used Mockito a lot of time ago.
In my case i just only apply the annotation @Mock on top of the element that i need to mock.
@Mock
Resource resource;
@Mock
Node node;
@Mock
NodeIterator nodeItr;
@Mock
Session session;
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
Probably you need to identify the method that you want to test and than mock the element that you need.
By reading your model, i don't find a lot of element to test just because your method have a very large purpose.
Let me know if you need some specific details.
Thanks,
Antonio
Views
Replies
Total Likes
See this GEMS Session here on testing: Adobe Experience Manager Help | Tools to use for testing Adobe Experience Manager applications
We are going to hold an in-depth Ask the AEM Community experts on this topic too in March. Reg will open early March.
The last place to look for more information is here:
Adobe Experience Manager Help | Getting Started with AEM Sites Chapter 8 - Unit Testing
Hope this helps...
Hi Antonio,
Is there any problem with using the @PostConstruct annotation for init() method in my model, and all my models were already developed by using the @PostConstruct annotation to init() method.
If I mock the Resource, resolver and so on, those are returning null when I call underTest.init() method from my TestInit() method as shown below.
underTest = new TestHeaderModel();
underTest.init();
And can you please let me know how to call the init() method to execute the logic inside this method.
Views
Replies
Total Likes
Of course you can use plain mockito, but there are more elegant solutions out there; I wrote a short series about it:
Writing unit tests for AEM — using SlingMocks | Things on a content management system
Writing unit tests for AEM (part 2): Maven Setup | Things on a content management system
Writing unittests for AEM (part 3): Mocking resources | Things on a content management system
Views
Replies
Total Likes