Creating Unit Test Cases for AEM Servlet with "system user" using Mockito | Community
Skip to main content
Level 2
November 10, 2020
Solved

Creating Unit Test Cases for AEM Servlet with "system user" using Mockito

  • November 10, 2020
  • 2 replies
  • 8140 views

Hi experts, 

My code works to create unit test cases for AEM servlet where session is being taken through request as shown below.

Session session = req.getResourceResolver().adaptTo(Session.class);

Below test code works fine:

public final AemContext ctx = new AemContext(ResourceResolverType.JCR_MOCK);

ctx.request().setAttribute(SlingBindings.class.getName(), slingBindings);

mycustomclass.doGet(ctx.request(), ctx.response());

 

I need to know where resourceResolver is retrieved through ResourceResolverFactory and a "system" user. 

Map<String, Object> authentication = Collections.singletonMap("sling.service.subservice", (Object) systemUserName);
resourceResolver = resolverFactory.getServiceResourceResolver(authentication);

 

I get nullpointerexception at the above line. May be I need to manipulate resolverFactory object through AEMContext before calling doGet().

Can anyone please help?

 

Thanks,

Parvathy

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 Sandeep6

Hi @parvathy_c ,

 

Please try below.

Map<String, Object> params = new HashMap<>();
params.put(resourceResolverFactory.SUBSERVICE, systemUserName);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
ResourceResolverFactory resourceResolverFactory = mock(ResourceResolverFactory.class);
when(resourceResolverFactory.getServiceResourceResolver(params)).thenReturn(resourceResolver);

 

Thanks,

Sandeep.

2 replies

SureshDhulipudi
Community Advisor
Community Advisor
November 10, 2020

you can try something like this:

 

boolean isServiceUser =true;
User mockSystermUser = mock(User.class);
when(mockSystermUser.isSystemUser()).thenReturn(isServiceUser);
UserManager mockUserManager = mock(UserManager.class);
when(mockUserManager.getAuthorizable("<<<<systemUserName>>>>")).thenReturn(mockSystermUser);

Map<String, Object> authentication = new HashMap<>();
authentication.put("<<<<system user.name>>>", systemUserName);
ResourceResolver resourceResolver = context.getService(ResourceResolverFactory.class).getResourceResolver(authentication);

doReturn(mockUserManager).when(<<update condition>>>).getUserManager(resourceResolver.adaptTo(Session.class));

Level 2
November 11, 2020

Thanks Suresh for your reply. 

Actually UserManager is deprecated. And getAuthorizable method doesnt exist now.

Also what do you mean by update condition? when(<<update condition>>>)

 

Thanks,

Parvathy

Sandeep6Accepted solution
Level 4
November 11, 2020

Hi @parvathy_c ,

 

Please try below.

Map<String, Object> params = new HashMap<>();
params.put(resourceResolverFactory.SUBSERVICE, systemUserName);
ResourceResolver resourceResolver = mock(ResourceResolver.class);
ResourceResolverFactory resourceResolverFactory = mock(ResourceResolverFactory.class);
when(resourceResolverFactory.getServiceResourceResolver(params)).thenReturn(resourceResolver);

 

Thanks,

Sandeep.

Level 4
November 11, 2020

I think you are getting null pointer for resourceResolverFactory.

 

Please add below line  mockContentOwnerServlet.setResourceResolverFactory(resourceResolverFactory);