Hyb90
Hyb90

Reputation: 1

AEM JUnit java.lang.NullPointerException

I need to create a Junit test for a class in an AEM project and I'm having NullPointerException problems: I create the 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);
    }

and the json structure:

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

when i Run test i give that result:

@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);
}

Upvotes: 0

Views: 1356

Answers (1)

toniedzwiedz
toniedzwiedz

Reputation: 18563

It looks like your model is a null reference. You do try to mock it with MockitoExtension but that's largely superfluous, given that you're also using AemContextExtension and it's probably the cause of the issue.

Null pointers aside, this code doesn't even test anything. Everything is mocked, even the Test class which I understand to be the subject under test.

Also, the parameter you're passing to addModelsForClasses looks like the test class (TestImpl) rather than the class of the Sling Model Test.

Instead of relying on Mockito, let the AEM Mocks library set up all the underlying objects by itself and make sure the class you're testing is the real thing, rather than a mock.

@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);
    }
}

See

Upvotes: 1

Related Questions