модульный тест «resource.adaptTo» нулевой указатель AEM Sling Model Java

#java #junit #aem #sling

#java #junit #aem #sling

Вопрос:

Я выполняю довольно простой модульный тест для модели Sling в AEM, поэтому, когда я запускаю тест, я получаю следующую ошибку:

[ОШИБКА] CtaModelTest.testGetText:36 нулевой точки

Это мой Java-код, модель представляет собой очень простую модель Sling AEM, я использую @ModelAnnotation следующее:

 @Model(adaptables = SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
  
 package com.myproject.core.models;
import org.apache.commons.lang3.StringUtils;
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 com.day.cq.wcm.api.Page;
import io.wcm.testing.mock.aem.junit5.AemContext;
import io.wcm.testing.mock.aem.junit5.AemContextExtension;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import junitx.util.PrivateAccessor;
import javax.inject.Inject;

@ExtendWith(AemContextExtension.class)
class CtaModelTest {
    private static final String COMPONENT_PATH = "/content/campaigns/myproject/master/demo-campaign/demo-email";
    
    private CtaModel ctaModel;

    private Page page;
    private Resource resource;

    @BeforeEach
    public void setup(AemContext context) throws Exception {
        
        context.load().json("/ctaModelTest.json", COMPONENT_PATH);
        context.addModelsForClasses(CtaModel.class);
        
        resource = context.resourceResolver().getResource(COMPONENT_PATH   "/jcr:content/par/hero/cta");
        ctaModel = resource.adaptTo(CtaModel.class);
    }

    @Test
    void testGetText() throws Exception {
        String txt = ctaModel.getText();
        assertNotNull(txt);
    }
}

  

Кто-нибудь может мне помочь это исправить?

Комментарии:

1. Можете ли вы опубликовать код своей модели, а также документ JSON, который вы загружаете, в тестовом контексте AEM? Это может быть простое несоответствие имени свойства, но трудно сказать, не видя строки, в которой происходит NPE.

Ответ №1:

Кажется, что resource.adaptTo(CtaModel.class) возвращено значение null. Проблема в том, что adaptTo(…) возвращает null очень тихо, если что-то не удается. Поэтому документация SlingMocks рекомендует ModelFactory.createModel(...) вместо adaptTo(...) для SlingModels.

https://sling.apache.org/documentation/development/sling-mock.html#model-instantiation

 // load some content into the mocked repo
context.load().json(..., "/resource1");

// load resource
Resource myResource = content.resourceResolver().getResource("/resource1");

// instantiate Sling Model (adaptable via Resource)
// this will throw exceptions if model cannot be instantiated
MyModel myModel = context.getService(ModelFactory.class).createModel(myResource, MyModel.class);
  

Если вы это сделаете, ModelFactory зарегистрирует информацию об ошибках, почему модель Sling не может быть создана. Итак, вы знаете, в чем проблема, и вам не нужно догадываться.

Ответ №2:

Если есть проблемы с методом инициализации, особенно если какой-либо введенный объект, такой как currentPage или services, равен null, то model автоматически вернет null даже при использовании CreateModel .

https://myaemlearnings.blogspot.com/2020/08/unit-testing-in-aem-debugging-issues-in.html