wcm.io Junit4 Test - Sling Model Constructor | Community
Skip to main content
May 12, 2020
Solved

wcm.io Junit4 Test - Sling Model Constructor

  • May 12, 2020
  • 2 replies
  • 4720 views

Hello, I am having a problem where the resource is not injected into the Sling Model constructor during a test, I was able to inject mock services into the constructor, but unable to with the resource object (I do not wish to inject the Resource via Sling Model Annotations, as I want to use the  constructor only):

WebData Sling Model:

@Model(adaptables = {SlingHttpServletRequest.class, Resource.class}, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) public class WebData { @586265 public WebData(Resource resource) { } }

 SlingModel Unit Test:

@2785667 public void itShouldInject() { Resource resource = context.resourceResolver().getResource("/content/my-site/page/jcr:content/par/web"); undertest = resource.adaptTo(WebData.class); }

 

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 BrianKasingli

Hey,

I know you said only constructor solutions, but I had a problem like this in the past, where It was extremely challenging to mock the Resource.class object into the constructor. Instead of initiating the Resource object dependency from the constructor, try using these Sling Model Annotations.

 

 

@Model public class WebData { // this adapts the adaptable object into a resource object. @1961677 private Resource resource; //or @ScriptVariable // this calls on the current resource. Resource resource; }

 

 

for other Sling Model annotations, checkout this blog https://sourcedcode.com/aem-sling-model-injectors-annotations-reference-guide

 

2 replies

arunpatidar
Community Advisor
Community Advisor
May 12, 2020

Hi,

Can you try with -

 

private final AemContext context = new AemContext(ResourceResolverType.RESOURCERESOLVER_MOCK);

  

Arun Patidar
BrianKasingli
Community Advisor and Adobe Champion
BrianKasingliCommunity Advisor and Adobe ChampionAccepted solution
Community Advisor and Adobe Champion
May 12, 2020

Hey,

I know you said only constructor solutions, but I had a problem like this in the past, where It was extremely challenging to mock the Resource.class object into the constructor. Instead of initiating the Resource object dependency from the constructor, try using these Sling Model Annotations.

 

 

@Model public class WebData { // this adapts the adaptable object into a resource object. @1961677 private Resource resource; //or @ScriptVariable // this calls on the current resource. Resource resource; }

 

 

for other Sling Model annotations, checkout this blog https://sourcedcode.com/aem-sling-model-injectors-annotations-reference-guide

 

May 13, 2020
thank you, I figured it out without the Constructer. this works!