Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

NPE when mocking ConfigurationManager class in AEM

Avatar

Level 4

I am trying to write a Junit for the below java method in AEM

 

public final Resource getConfigProp(final Page page,
            final ConfigType configType, final ResourceResolver resolver)
    {

        final HierarchyNodeInheritanceValueMap iProp= new HierarchyNodeInheritanceValueMap(
                page.getContentResource());

        iPropString[] services = inheritedPageProperties.getInherited(configType.PN_CONFIGURATIONS,
                new String[0]);
        final com.day.cq.wcm.webservicesupport.ConfigurationManager configurationManager = resolver
                .adaptTo(com.day.cq.wcm.webservicesupport.ConfigurationManager.class);
        if (null != configurationManager)
        {
            final Configuration cg = configurationManager.getConfiguration("tok-yo", services);// getConfiguration is coming as null in Mockito
            return cg.getContentResource();
        }
        return null;
    }

Here is my Mockito. Everything is mocked correctly but for some reason getConfiguration method is giving me null. Can anyone tell why this mocking is not working?

 

@Before public void setUp() throws Exception
    {

        configMgr = mock(ConfigurationManager.class);
        config = mock(Configuration.class);
        currentPage = mock(Page.class);
        resource = mock(Resource.class);
        resourceResolver = mock(ResourceResolver.class);
        iValueMap = mock(HierarchyNodeInheritanceValueMap.class);

        configService = new ConfigImpl();
        
        when(currentPage.getContentResource()).thenReturn(resource);

        whenNew(HierarchyNodeInheritanceValueMap.class).withArguments(resource)
                .thenReturn(iValueMap);

        when(iValueMap.getInherited("cq:cloudserviceconfigs", new String[0]))
                .thenReturn(TEST_SERVICES);

        when(configMgr.getConfiguration(TEST_CONFIG_NAME, TEST_SERVICES)).thenReturn(config); //getConfiguration is returning null
        when(config.getContentResource()).thenReturn(resource);
    }

    @Test public void testConfigProp() throws Exception
    {
        ValueMap valueMap = mock(ValueMap.class);

        when(resource.adaptTo(ValueMap.class)).thenReturn(valueMap);
        when(resourceResolver.adaptTo(ConfigurationManager.class)).thenReturn(configMgr);
        
        // Verify
        assertEquals(valueMap, configService.getConfigProp(currentPage, configType, resourceResolver));
    }

Error trace:-

java.lang.NullPointerException
at com.aem.services.impl.ConfigImpl.getConfigResource(ConfigImpl.java:55)
at com.config.impl.ConfigImplTest.getConfigProp(ConfigImplTest.java:89)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

 

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

The parameters passing should be wrong.

Can you try with hardcoded values here: 

when(configMgr.getConfiguration(TEST_CONFIG_NAME, TEST_SERVICES))

====

 

@Mock
private ConfigurationManager configMgr;

@Mock
private Configuration configuration;

 

in method===

testMethod() {

String[] configs = new String[]{"config1"};

when(configMgr.getConfiguration("yourValue", configs)).thenReturn(configuration);

}

 

View solution in original post

3 Replies

Avatar

Correct answer by
Community Advisor

The parameters passing should be wrong.

Can you try with hardcoded values here: 

when(configMgr.getConfiguration(TEST_CONFIG_NAME, TEST_SERVICES))

====

 

@Mock
private ConfigurationManager configMgr;

@Mock
private Configuration configuration;

 

in method===

testMethod() {

String[] configs = new String[]{"config1"};

when(configMgr.getConfiguration("yourValue", configs)).thenReturn(configuration);

}

 

Avatar

Level 2

@Anderson_Hamer @SureshDhulipudi @arunpatidar 

I am facing similar issue here, I am getting the value in 'valueMap' but getInherited() method is not working in Junit class. Please suggest. 

nibedita07_1-1668077622215.png