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

MockitoJUnitRunner for junit in AemContext how to set user details

srinivas_chann1
Level 7
Level 7

Hi ,

 

I am using MockitoJUnitRunner for Junit .

 

I having the below code in java :-

User currentUser = request.getResourceResolver().adaptTo(User.class);

if(currentUser.isAdmin())
return;

Iterator<Group> currentUserGroups = currentUser.memberOf();

while (currentUserGroups.hasNext()) {
Group grp = (Group) currentUserGroups.next();
if(grp.getID().equals(GROUP)) {
-----
}
}

 

issue:-

 

So want to simulate the user and groups using Aemcontext and want to know how to set up user and group details for AEM context

 

I am using the below code 

@RunWith(MockitoJUnitRunner.class)
public class ComponentTestingTest {

@Rule
public final AemContext context = new AemContext(ResourceResolverType.JCR_MOCK);
}



Thanks

 

1 Accepted Solution
Vijayalakshmi_S
Correct answer by
Community Advisor
Community Advisor

Hi @srinivas_chann1,

I will try in my local and respond to this thread.

On a high level, there is no direct method under AemContext for UserManager/User related. We might have to mock and provide dummy implementation to the methods we call. 

 

View solution in original post

12 Replies
Vijayalakshmi_S
Correct answer by
Community Advisor
Community Advisor

Hi @srinivas_chann1,

I will try in my local and respond to this thread.

On a high level, there is no direct method under AemContext for UserManager/User related. We might have to mock and provide dummy implementation to the methods we call. 

 

View solution in original post

srinivas_chann1
Level 7
Level 7
Hi , Any samples on dummy implementation will help. Thanks
Vijayalakshmi_S
Community Advisor
Community Advisor

Hi @srinivas_chann1,

Please find below sample Test case for the snippet posted in the query

Sample Model :

https://github.com/Viji1304/aemlearnings-samples/blob/master/learnings/core/src/main/java/learnings/...

Sample Test class :

https://github.com/Viji1304/aemlearnings-samples/blob/master/learnings/core/src/test/java/learnings/...

 

Flow goes like this:

  • UserManager, User and Group are mocked using MockitoExtension.class
  • Create adapterFactory for above 3 mocked APIs (aemContext.registerAdapter(adaptable, adapter, adapter object))
  • Dummy implementation using when and thenReturn methods.

Junit Version : 5

Maven Archetype : 22

AEM Version : 6.5.0

Note :

  • Couldn't do code coverage.
  • Along the similar lines of sample Test class file, request you to try for the actual code logic. If anything is not handled, update in this thread
srinivas_chann1
Level 7
Level 7

Thanks for the input .I have still one pending issue will you be able to help on this

 

Java code:-

ComponentContext cc = WCMUtils.getComponentContext(slingHttpServletRequest);
cc.setDecorate(false);

 

Junit:-

I am trying 

@Mock
private MockSlingHttpServletRequest request;

request = aemContext.request();


request.setAttribute("com.day.cq.wcm.componentcontext",aemContext componentContext());

 

Throws the below error

 

java.lang.ClassCastException: org.apache.sling.testing.mock.osgi.MockComponentContext cannot be cast to com.day.cq.wcm.api.components.ComponentContext

at com.day.cq.wcm.commons.WCMUtils.getComponentContext(WCMUtils.java:248)

 

 

 

Vijayalakshmi_S
Community Advisor
Community Advisor

Hi @srinivas_chann1,

There are two ComponentContext one for cq:Component and other for OSGI.

  • com.day.cq.wcm.api.components.ComponentContext - (cq:Component)
  • org.osgi.service.component.ComponentContext - (OSGI component)

Please share the functionality that you are achieving with cq:Component's ComponentContext. Based on that we will be able to write/assert tests.

Note : ComponentContext provided by AemContext is for OSGI and not for cq:Component.

srinivas_chann1
Level 7
Level 7

Hi,

Thanks for the response .

The use case is for a component dialog ,i would want to hide it based on groups .

 

This could be achieved by setting cq:noDecoration flag to true

 

This can be achieved by

ComponentContext cc = WCMUtils.getComponentContext(slingHttpServletRequest);
cc.setDecorate(false);

 

I see that the import statement is 

com.day.cq.wcm.api.components.ComponentContext;

 

Thanks.

Vijayalakshmi_S
Community Advisor
Community Advisor

Hi @srinivas_chann1,

Ok, getting. 

Please try the below code and let know if it works. (Have pushed to GitHub too)

Spy of Mockito is used to call real implementation of a method. Hence we need not provide dummy implementation to the componentContext.

Please incorporate the test statements accordingly (per your code flow.)

@Spy
	private ComponentContext spyCmpContext;
@Test
	void testForComponentDecoration() {
		MockSlingHttpServletRequest mockSlingRequest = aemContext.request();
		mockSlingRequest.setAttribute(ComponentContext.CONTEXT_ATTR_NAME, spyCmpContext);
		spyCmpContext.setDecorate(false);
		assertFalse(spyCmpContext.hasDecoration());
	}

 

ChitraMadan
Community Advisor
Community Advisor

Hi @srinivas_chann1 ,

 

May be try to do something like 

when(resourceResolver.getUserID()).thenReturn("anonymous"); 

or 

when(resourceResolver.getUserID()).thenReturn("admin");

or may be in your case, try, when(currentUser.isAdmin()).thenReturn("true");

 

Check out this Test Class where they have written tests based on anonymous or admin user

https://github.com/Adobe-Consulting-Services/acs-aem-commons/pull/1654/files#diff-82733893b715dd3d4c...