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

how to write JUNITs for constructor in AEM

Avatar

Level 1

Hi All,

 

I have class like this which is using the constructor, can anyone please suggest me how to write a JUNIT for the constructor.

 

  

public class ABCModel extends XYZlManagerModel {
public ABCModel(String pagePath, Resource resource, LabelManagerFactoryConfig config) {
super(pagePath, resource, config);
}
protected XYZManagerModel(String pagePath, Resource resource, LabelManagerFactoryConfig config) {
this.resource = resource;
this.resolver = resource.getResourceResolver();
this.platformConfig = LabelManagerUtils.getCurrentConfig(pagePath, config);
this.dictionaryPath = buildDictionaryPath(pagePath);
}

public abstract String buildDictionaryPath(String pagePath);

Thanks in Advance.
1 Accepted Solution

Avatar

Correct answer by
Community Advisor

Hi @JagarlamudiVe 
To write a JUnit test for the constructor of the ABCModel class, you can use a testing framework like JUnit and create a test class that extends the TestCase class.

 

import junit.framework.TestCase;
import org.apache.sling.api.resource.Resource;

public class ABCModelTest extends TestCase {
    public void testConstructor() {
        // Create a mock Resource object
        Resource resource = createMockResource();

        // Create a mock LabelManagerFactoryConfig object
        LabelManagerFactoryConfig config = createMockConfig();

        // Create an instance of the ABCModel class using the constructor
        ABCModel model = new ABCModel("/content/mypage", resource, config);

        // Assert that the object was created successfully
        assertNotNull(model);
    }

    private Resource createMockResource() {
        // Implement a mock Resource object for testing purposes
        // ...
    }

    private LabelManagerFactoryConfig createMockConfig() {
        // Implement a mock LabelManagerFactoryConfig object for testing purposes
        // ...
    }
}

 

 

we create a test method called testConstructor()  that creates a mock Resource object and a mock LabelManagerFactoryConfig object. We then create an instance of the ABCModel class using the constructor and assert that the object was created successfully using the assertNotNull() method.

You can also add additional assertions to the test method to verify that the object was created with the correct values. For example, you can assert that the pagePath parameter was set correctly by adding the following assertion:
assertEquals("/content/mypage", model.getPagePath());



View solution in original post

3 Replies

Avatar

Level 5

Hi @JagarlamudiVe ,

 

Check the below code and play around with it

 

 

@ExtendWith({ AemContextExtension.class, MockitoExtension.class })
class ABCModelTest {

    
    private ABCModel  aBCModel;
	
	@Mock
    private LabelManagerFactoryConfig config;
	
	private final AemContext aemContext = new AemContext();

    @BeforeEach
    public void setup() {
		aemContext.load().json("<path-where-you-store-json>", "<page-path>");
        aemContext.currentResource("<page-path>");
		Resource resource = aemContext.resourceResolver().getResource("<page-path>");
		String pagePath = resource.getPath();
		aemContext.registerService(LabelManagerFactoryConfig.class, config); // Mock the config & register it in aem context
        aBCModel = new ABCModel(pagePath, resource, config); // Initializing your class 
    }

    @Test
    public void buildDictionaryPathTest() {
        /** Use assert staements **/
    }
}

 

Avatar

Correct answer by
Community Advisor

Hi @JagarlamudiVe 
To write a JUnit test for the constructor of the ABCModel class, you can use a testing framework like JUnit and create a test class that extends the TestCase class.

 

import junit.framework.TestCase;
import org.apache.sling.api.resource.Resource;

public class ABCModelTest extends TestCase {
    public void testConstructor() {
        // Create a mock Resource object
        Resource resource = createMockResource();

        // Create a mock LabelManagerFactoryConfig object
        LabelManagerFactoryConfig config = createMockConfig();

        // Create an instance of the ABCModel class using the constructor
        ABCModel model = new ABCModel("/content/mypage", resource, config);

        // Assert that the object was created successfully
        assertNotNull(model);
    }

    private Resource createMockResource() {
        // Implement a mock Resource object for testing purposes
        // ...
    }

    private LabelManagerFactoryConfig createMockConfig() {
        // Implement a mock LabelManagerFactoryConfig object for testing purposes
        // ...
    }
}

 

 

we create a test method called testConstructor()  that creates a mock Resource object and a mock LabelManagerFactoryConfig object. We then create an instance of the ABCModel class using the constructor and assert that the object was created successfully using the assertNotNull() method.

You can also add additional assertions to the test method to verify that the object was created with the correct values. For example, you can assert that the pagePath parameter was set correctly by adding the following assertion:
assertEquals("/content/mypage", model.getPagePath());



Avatar

Community Advisor

Hi @JagarlamudiVe ,

To write a JUnit test for the constructor of the ABCModel class, you can use a testing framework like JUnit along with mocking frameworks like Mockito to mock the dependencies such as Resource and LabelManagerFactoryConfig. Here's an example of how you can write a JUnit test for the constructor:

import org.apache.sling.api.resource.Resource;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

public class ABCModelTest {

    @Mock
    private Resource mockResource;

    @Mock
    private LabelManagerFactoryConfig mockConfig;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testConstructor() {
        // Mock necessary behavior for Resource and LabelManagerFactoryConfig
        when(mockResource.getResourceResolver()).thenReturn(null); // You can provide a resolver mock if needed
        // Add more behavior mocks for LabelManagerFactoryConfig if needed

        // Create an instance of ABCModel
        ABCModel abcModel = new ABCModel("/some/page/path", mockResource, mockConfig);

        // Verify that the constructor initializes the necessary fields correctly
        assertEquals("/some/page/path", abcModel.getPagePath());
        // Add more assertions for other fields if needed
    }
}

 


In this particular case, since you are testing the constructor of the ABCModel class, which doesn't seem to directly depend on any OSGi services or require service injection, you don't need to register any services for your JUnit test.
In this case, you don't need to explicitly register the LabelManagerFactoryConfig service, as it's being mocked and provided directly to the constructor during the test setup.

Thanks,
Madhur