Expand my Community achievements bar.

Learn about Edge Delivery Services in upcoming GEM session
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