繁体   English   中英

AEM JUnit java.lang.NullPointerException

[英]AEM JUnit java.lang.NullPointerException

我需要为 AEM 项目中的一个类创建一个 Junit 测试,我遇到了 NullPointerException 问题:我创建了 ClassTestImpl

@ExtendWith({AemContextExtension.class, MockitoExtension.class})
class TestImpl {
    private final AemContext ctx = new AemContext();

    @Mock
    private Test test;

    @Mock
    private ModelFactory modelFactory;

    @BeforeEach
    void setUp() throws Exception {
        ctx.addModelsForClasses(TestImpl.class);

        ctx.load().json("/com/project/core/models/adobe/TestImplTest.json","/content");
        lenient().when(modelFactory.getModelFromWrappedRequest(eq(ctx.request()), 
 any(Resource.class), eq(Test.class)))
                .thenReturn(test);
    }

    @Test
    void testGetText() {
        final String expected = "textTEST";
        ctx.currentResource("/content/text");
        Test test = ctx.request().adaptTo(Test.class);
        String actual = test.getText();
        assertEquals(expected,actual);
    }

和json结构:

  "text": {
    "jcr:primaryType": "nt:unstructured",
    "sling:resourceType": "project/components/core/title",
    "text": "textTEST"
  }
}

当我运行测试时,我给出了结果:

@Test
void testGetText() {
    final String expected = "titleTEST";
    ctx.currentResource("/content/title");
    Title title = ctx.request().adaptTo(Title.class);

    -->String actual = title[NullPointerException].getText();<--

    assertEquals(expected,actual);
}

看起来您的模型是null引用。 您确实尝试使用MockitoExtension来模拟它,但这在很大程度上是多余的,因为您也在使用AemContextExtension并且这可能是问题的原因。

除了空指针,这段代码甚至没有测试任何东西。 一切都被嘲笑,即使是我理解为被测试对象的Test类。

此外,您传递给addModelsForClasses的参数看起来像测试类 ( TestImpl ) 而不是 Sling Model Test的类。

不要依赖 Mockito,而是让 AEM Mocks 库自行设置所有底层对象,并确保您正在测试的类是真实的,而不是模拟的。

@ExtendWith(AemContextExtension.class)
class TestImpl {
    private final AemContext ctx = new AemContext();

    @BeforeEach
    void setUp() throws Exception {
        ctx.addModelsForClasses(Test.class); // Give it the Sling Model

        ctx.load().json("/com/project/core/models/adobe/TestImplTest.json","/content");
    }

    @Test
    void testGetText() {
        final String expected = "textTEST";
        ctx.currentResource("/content/text");
        Test test = ctx.request().adaptTo(Test.class); // It'll use the actual class, not a mock this way
        String actual = test.getText();
        assertEquals(expected,actual);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM