Expand my Community achievements bar.

Dive into Adobe Summit 2024! Explore curated list of AEM sessions & labs, register, connect with experts, ask questions, engage, and share insights. Don't miss the excitement.
SOLVED

wcm.io Junit4 Test - Sling Model Constructor

Avatar

Level 2

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 {
    @inject
    public WebData(Resource resource) {
        
    }
}

 SlingModel Unit Test:

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

 

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

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.
   @Deleted Account
   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

 

View solution in original post

3 Replies

Avatar

Community Advisor

Hi,

Can you try with -

 

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

  



Arun Patidar

Avatar

Correct answer by
Community Advisor

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.
   @Deleted Account
   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

 

Avatar

Level 2
thank you, I figured it out without the Constructer. this works!