Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
BedrockMission!

Learn more

View all

Sign in to view all badges

SOLVED

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

Parvathy_C
Level 2
Level 2

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

1 Accepted Solution
Sandeep6
Correct answer by
Level 5
Level 5

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.

View solution in original post

11 Replies
SureshDhulipudi
Community Advisor
Community Advisor

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

Parvathy_C
Level 2
Level 2

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

SureshDhulipudi
Community Advisor
Community Advisor
I mean to say, what you are going to test in update condition (i.e when (your class object is true)
SureshDhulipudi
Community Advisor
Community Advisor
Can you give your source code of the servlet and test class here
Sandeep6
Correct answer by
Level 5
Level 5

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.

View solution in original post

Parvathy_C
Level 2
Level 2

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!

Sandeep6
Level 5
Level 5

I think you are getting null pointer for resourceResolverFactory.

 

Please add below line  mockContentOwnerServlet.setResourceResolverFactory(resourceResolverFactory); 

Parvathy_C
Level 2
Level 2
Yes, resourceResolverFactory is coming null mostly. But didn't quite get you. My servlet doesnt have setResourceResolverFactory method. How can i set resourceResolverFactory from testclass ?
Sandeep6
Level 5
Level 5

Please add below lines your servlet. Then it will work.

 

private ResourceResolverFactory resourceResolverFactory;

@reference
public void setResourceResolverFactory(
ResourceResolverFactory resourceResolverFactory) {
this.resourceResolverFactory = resourceResolverFactory;
}

 

Thanks,

Sandeep.

Parvathy_C
Level 2
Level 2
Thanks, but then session comes null. Session session = CustomUtil.getResourceResolver(resourceResolverFactory).adaptTo(Session.class); Do I need to mock session also from test class?
Parvathy_C
Level 2
Level 2

As you mentioned, Added below line for session as well, worked.

when(resolver.adaptTo(Session.class)).thenReturn(mockSession);

Thanks Sandeep!