AEM QueryBuilder Junits | Community
Skip to main content
Level 3
May 7, 2024
Solved

AEM QueryBuilder Junits

  • May 7, 2024
  • 4 replies
  • 842 views

Hi,
We have a requirement to write Junits for Below code, can anyone please help us writing the code for junits for AEMAACS
Sample Code:

import com.adobe.granite.asset.api.Asset;
import com.adobe.granite.asset.api.AssetManager;
 
public static Map<String, Asset> getListOfAllAssetsFromQBVideo(ResourceResolver resolver, String assetFolderPath,String limitAll) throws RepositoryException
{
        QueryBuilder queryBuilder = resolver.adaptTo(QueryBuilder.class);
        Session session = resolver.adaptTo(Session.class);
        Map<String, String> predicate = new HashMap<>();
        predicate.put("path", assetFolderPath);
        predicate.put("type", EDAMConstants.DAM_ASSET);
        predicate.put("p.limit", limitAll);
        Query query = null;
        query = queryBuilder.createQuery(PredicateGroup.create(predicate), session);
        SearchResult searchResult = query.getResult();
        String path = "";
        Map<String, Asset> assetMap = new HashMap<>();
        for (Hit hit : searchResult.getHits()) {
            path = hit.getPath();
            Asset asset = resolver.getResource(path).adaptTo(Asset.class);
            assetMap.put(asset.getName(), asset);
        }
        return assetMap;
    }

Request you to please provide the sample junits code for above example

Thanks & Regards

 

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by TarunKumar

Hi @vishal33 ,

You will have to mock queryBuilder in JUNIT class.
Sample code you can follow would look something like below:

@Mock(answer = Answers.RETURNS_DEEP_STUBS) private QueryBuilder queryBuilder; @BeforeEach public void setup() throws LoginException { // setup mock service objects needed for the test context.registerService(QueryService.class, queryService, org.osgi.framework.Constants.SERVICE_RANKING, Integer.MAX_VALUE); context.registerService(QueryBuilder.class, queryBuilder); // load test content context.load().json("<path-to-json-file>.json", "/content"); } @Test public void testOutput() { Map<String, String> pageMap = new HashMap<>(); pageMap.put("parent", "<page-path>"); pageMap.put("comp", "root/<component-path>"); pageMap.put("page", "p1"); List<String> results = new ArrayList<>(Arrays.asList("/content/sample1", "/content/sample2")); SearchResults searchResults = new SearchResults(); searchResults.setTotalResults('1'); searchResults.setResults(results); String expectedResponse = "<mention-your-expected-response" String allItemsExpectedResponse = "" Resource resource = context.currentResource("/content/<sample-path>"); when(queryService.executeSearchWithMetadata(any())).thenReturn(searchResults); when(<class-name>.getSearchResults(1, new String[0],null)).thenReturn(searchResults); assertEquals(2, <class-name>.generateOutput(resource, context.resourceResolver(), pageMap).size()) }

 

 

Thanks
Tarun

4 replies

sravs
Community Advisor
Community Advisor
May 7, 2024

Hi @vishal33 , you can create mock objects for QueryBuilder, Query, and Session using

Mockito

// Mock objects
@Mock
private QueryBuilder queryBuilder;
@Mock
private Query query;
@Mock
private Session session;
@Mock
private SearchResult searchResult;

@Mock
private Asset asset;
//In setup method register adapters
@BeforeEach
void setUp() {
context.registerAdapter(ResourceResolver.class, Session.class, session);
context.registerAdapter(Resource.class, Asset.class, asset);
context.registerAdapter(ResourceResolver.class, QueryBuilder.class, queryBuilder); context.create.resource("/content/dam/sample");
}

//In test method
@Test
void testGetListOfAllAssetsFromQBVideo() throws RepositoryException{
// When-Then mocking
when(queryBuilder.createQuery(any(PredicateGroup.class), eq(session))).thenReturn(query); when(query.getResult()).thenReturn(searchResult);
when(searchResult.getHits()).thenReturn(hits);
when(asset.getName()).thenReturn("Sample");
when(hit.getPath()).thenReturn("/content/dam/sample"); // Call your method here
}

 This is a sample code, you can mock or update the code according to your requirements.

 

Hope this helps!!!

TarunKumar
Community Advisor
TarunKumarCommunity AdvisorAccepted solution
Community Advisor
May 7, 2024

Hi @vishal33 ,

You will have to mock queryBuilder in JUNIT class.
Sample code you can follow would look something like below:

@Mock(answer = Answers.RETURNS_DEEP_STUBS) private QueryBuilder queryBuilder; @BeforeEach public void setup() throws LoginException { // setup mock service objects needed for the test context.registerService(QueryService.class, queryService, org.osgi.framework.Constants.SERVICE_RANKING, Integer.MAX_VALUE); context.registerService(QueryBuilder.class, queryBuilder); // load test content context.load().json("<path-to-json-file>.json", "/content"); } @Test public void testOutput() { Map<String, String> pageMap = new HashMap<>(); pageMap.put("parent", "<page-path>"); pageMap.put("comp", "root/<component-path>"); pageMap.put("page", "p1"); List<String> results = new ArrayList<>(Arrays.asList("/content/sample1", "/content/sample2")); SearchResults searchResults = new SearchResults(); searchResults.setTotalResults('1'); searchResults.setResults(results); String expectedResponse = "<mention-your-expected-response" String allItemsExpectedResponse = "" Resource resource = context.currentResource("/content/<sample-path>"); when(queryService.executeSearchWithMetadata(any())).thenReturn(searchResults); when(<class-name>.getSearchResults(1, new String[0],null)).thenReturn(searchResults); assertEquals(2, <class-name>.generateOutput(resource, context.resourceResolver(), pageMap).size()) }

 

 

Thanks
Tarun

abhishekanand_
Community Advisor
Community Advisor
May 7, 2024

Hi @vishal33 

 

You will have to mock queryBuilder in JUNIT class.


you can also refer to this blog

https://taylor.callsen.me/unit-testing-aem-sling-models-and-servlets/ 

Hope this helps!

Abhishek Anand
HrishikeshKagne
Community Advisor
Community Advisor
May 8, 2024