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
Bedrock Mission!

Learn more

View all

Sign in to view all badges

SOLVED

Could not yet find an adapter factory for the model class my_class from adaptable class org.apache.sling.testing.resourceresolver.MockResource

Avatar

Level 2

Hi All,

I coudln't able to adapt the resource to my Sling Model class,
getting the error 
Could not yet find an adapter factory for the model class my_class from adaptable class org.apache.sling.testing.resourceresolver.MockResource.

Attaching the Sling models and junit files here.
Model Interface

 

 

package com.mycore.core.models;
import org.apache.commons.lang.StringUtils;
public interface ConfiguratorPromptModel {
    default String getNameplateId() {
        return StringUtils.EMPTY;
    }
}

 

 


Model Implementation

 

 

package com.mycore.core.internal.models.v1;

import com.mycore.core.models.ConfiguratorPromptModel;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.InjectionStrategy;
import org.apache.sling.models.annotations.injectorspecific.ValueMapValue;

@Model(adaptables = Resource.class, adapters = {ConfiguratorPromptModel.class})
public class ConfiguratorPromptModelImpl  implements ConfiguratorPromptModel {
    public String getNameplateId() {
        return nameplateId;
    }
    @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL)
    private String nameplateId;

}

 

 


Test Case

 

 

package com.mycore.core.internal.models.v1;

import com.mycore.core.models.ConfiguratorPromptModel;
import io.wcm.testing.mock.aem.junit5.AemContext;
import io.wcm.testing.mock.aem.junit5.AemContextExtension;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.factory.ModelFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import static org.junit.jupiter.api.Assertions.assertEquals;

@ExtendWith(AemContextExtension.class)
class ConfiguratorPromptModelImplTest {
    private ConfiguratorPromptModel configuratorPromptModel;

    @BeforeEach
    public void setUp(AemContext context) throws Exception {
        context.load().json("/content/configuratorprompt/configuratorprompt.json", "/content/configuratorprompt.html");
        Resource resource = context.resourceResolver().getResource("/content/configuratorprompt.html");
        this.configuratorPromptModel = context.getService(ModelFactory.class).createModel(resource, ConfiguratorPromptModelImpl.class);
    }

    void getNameplateId() {
        assertEquals("nameplate", configuratorPromptModel.getNameplateId());
    }

}

 

 


Thanks,
Gokulraj

 

 

1 Accepted Solution

Avatar

Correct answer by
Employee Advisor

Hi @rsGokulraj4 ,

{
	"jcr:primaryType": "cq:Page",
	"jcr:content": {
		"jcr:primaryType": "cq:PageContent",
		"jcr:title": "en",
		"cq:template": "/conf/we-retail/settings/wcm/templates/homepage",
		"cq:contextHubSegmentsPath": "/etc/segmentation/contexthub",
		"jcr:isCheckedOut": true,
		"pageTitle": "Test page",
		"jcr:uuid": "d2d32722-0ce4-4663-8873-1b11a8e34ceb",
		"sling:resourceType": "we-retail/components/page",
		"cq:contextHubPath": "/etc/cloudsettings/default/contexthub",
		"root": {
			"jcr:primaryType": "nt:unstructured",
			"layout": "responsiveGrid",
			"sling:resourceType": "we-retail/components/container",
			"container": {
				"jcr:primaryType": "nt:unstructured",
				"sling:resourceType": "we-retail/components/container",
				"container": {
					"jcr:primaryType": "nt:unstructured",
					"layout": "responsiveGrid",
					"sling:resourceType": "we-retail/components/container",
					"banner": {
						"jcr:primaryType": "nt:unstructured",
						"id": "1234",
						"type": "callbutton",
						"bannerText":"Banner Text",
						"sling:resourceType": "we-retail/components/banner",
						"cq:styleIds": [
							"1654672680483",
							"1654672784107"
						]
						
					}
				}
			}
		}
	}
}

Is this working now?

Thanks

View solution in original post

4 Replies

Avatar

Employee Advisor

Hi @rsGokulraj4 ,

 

PFB example 

 

@ExtendWith(AemContextExtension.class)
public class BannerTest {
    /** The Constant RESOURCE_CONTENT. */
    private static final String RESOURCE_CONTENT = "/core/models/banner/banner.json";

    /** The Constant TEST_CONTENT_ROOT. */
    private static final String TEST_CONTENT_ROOT = "/content/we-retail/us/en";

    /** The Constant RESOURCE. */
    private static final String RESOURCE = TEST_CONTENT_ROOT + "/jcr:content/root/container/container/banner";

    /** The model. */
    private Banner model;

    /** The resource. */
    private Resource resource;

    /**
     * Sets the up.
     *
     * @param aemContext the new up
     */
    @BeforeEach
    public void setup(AemContext aemContext) {
        Class<Banner> modelClass = Banner.class;
        aemContext.load().json(RESOURCE_CONTENT, TEST_CONTENT_ROOT);
        aemContext.addModelsForClasses(modelClass);
        resource = aemContext.currentResource(RESOURCE);
        model = resource.adaptTo(modelClass);
    }

    /**
     * Simple load and getter test.
     */
    @Test
    public void simpleLoadAndGetterTest() {
        assertEquals("1234", model.getId());
        assertEquals("Banner Text", model.getBannerText());
    }

}

Hope this helps

 

Thanks

Avatar

Level 2

Hi @Bimmi_Soi 
Thanks for the suggestion,
I tried the approach you have shared, but still getting the null exception on line.

 model = resource.adaptTo(modelClass); 

 

Avatar

Employee Advisor

Check if you are using these imports and share the json file

 

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.apache.sling.api.resource.Resource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import io.wcm.testing.mock.aem.junit5.AemContext;
import io.wcm.testing.mock.aem.junit5.AemContextExtension;

Avatar

Correct answer by
Employee Advisor

Hi @rsGokulraj4 ,

{
	"jcr:primaryType": "cq:Page",
	"jcr:content": {
		"jcr:primaryType": "cq:PageContent",
		"jcr:title": "en",
		"cq:template": "/conf/we-retail/settings/wcm/templates/homepage",
		"cq:contextHubSegmentsPath": "/etc/segmentation/contexthub",
		"jcr:isCheckedOut": true,
		"pageTitle": "Test page",
		"jcr:uuid": "d2d32722-0ce4-4663-8873-1b11a8e34ceb",
		"sling:resourceType": "we-retail/components/page",
		"cq:contextHubPath": "/etc/cloudsettings/default/contexthub",
		"root": {
			"jcr:primaryType": "nt:unstructured",
			"layout": "responsiveGrid",
			"sling:resourceType": "we-retail/components/container",
			"container": {
				"jcr:primaryType": "nt:unstructured",
				"sling:resourceType": "we-retail/components/container",
				"container": {
					"jcr:primaryType": "nt:unstructured",
					"layout": "responsiveGrid",
					"sling:resourceType": "we-retail/components/container",
					"banner": {
						"jcr:primaryType": "nt:unstructured",
						"id": "1234",
						"type": "callbutton",
						"bannerText":"Banner Text",
						"sling:resourceType": "we-retail/components/banner",
						"cq:styleIds": [
							"1654672680483",
							"1654672784107"
						]
						
					}
				}
			}
		}
	}
}

Is this working now?

Thanks