Creating Unit Test Cases for AEM Servlet with "system user" using Mockito | Community
Skip to main content
Level 2
Nov 10, 2020 12:05 PM UTC
Solved

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

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.
Sandeep6Accepted solution
Level 4
Nov 11, 2020 4:24 AM UTC

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.

11 replies

Sandeep6Accepted solution
Level 4
Nov 11, 2020 4:24 AM UTC

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.

Translate
Level 2
Nov 11, 2020 8:17 AM UTC

Hi Sandeep, Thanks for your reply. I tried like this, as you mentioned :

@Mock
private ResourceResolver resolver;
@Mock
private ResourceResolverFactory resolverFactory;

 

void test() throws RepositoryException, JSONException, ServletException, IOException{

Map<String, Object> params = new HashMap<>();
params.put(resolverFactory.SUBSERVICE, "testsystemuser");
when(resolverFactory.getServiceResourceResolver(params)).thenReturn(resolver);
mockContentOwnerServlet.doGet(ctx.request(), ctx.response());
assertEquals(ctx.response().getStatus(), SlingHttpServletResponse.SC_OK);

}

 

But I still get nullpointer exception in the class where the below line is mentioned:

ResourceResolver resourceResolver = resolverFactory.getServiceResourceResolver(AUTH_INFO);

 

Any way out ?

 

Thanks in advance!

Translate
SureshDhulipudi
New Participant
Nov 10, 2020 3:58 PM UTC

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));

Translate
Level 2
Nov 11, 2020 8:24 AM UTC

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

Translate