how to write test cases for Servlet reading response boolean, | Community
Skip to main content
March 6, 2024
Solved

how to write test cases for Servlet reading response boolean,

  • March 6, 2024
  • 2 replies
  • 975 views

Tried with below approach getting errors not able to proceed further

Get method from Servlet:

 

protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
 
ResourceResolver resourceResolver = request.getResourceResolver();
TagManager tagManager = resourceResolver.adaptTo(TagManager.class);
String tagName = request.getParameter("tagName");
Tag tagPath = Objects.requireNonNull(tagManager).resolve(tagName);
Iterator<Tag> tagChildren = tagPath.listChildren();
String hasChildren = "false";
if (tagChildren.hasNext()) {
hasChildren = "true";
}
 
response.setContentType("text/plain");
response.getWriter().write(hasChildren);
}
 
 
 
Test cases for above method:
 
import io.wcm.testing.mock.aem.junit5.AemContextExtension;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
 
import com.day.cq.tagging.TagManager;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
 
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
 
@ExtendWith(AemContextExtension.class)
public class ServletTest {
 
    private SlingHttpServletRequest request;
    private SlingHttpServletResponse response;
    private ResourceResolver resolver;
    private TagManager tagManager;
    
    @BeforeEach
    void setup() throws IOException {
        request = mock(SlingHttpServletRequest.class);
        resolver = mock(ResourceResolver.class);
        response = mock(SlingHttpServletResponse.class);       
        when(request.getResourceResolver()).thenReturn(resolver);
        when(resolver.adaptTo(TagManager.class)).thenReturn(tagManager);
        PrintWriter writer = mock(PrintWriter.class);
        when(response.getWriter()).thenReturn(writer);
    }
    
    
    @2785667
    void testDoGet() throws IOException, ServletException {
    Servlet servlet = new Servlet();
        servlet.doGet(request, response);
        verify(response.getWriter()).write("true");
        verify(response.getWriter()).close();
    }
  
}
 
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 anupampat

I see you have mocked ResourceResolver & then trying to adapt it as TagManager, which will always throw NullPointer.

You will need to make use of AemContext to register the TagManager as an adapter

 e.g. 

aemContext.registerAdapter(ResourceResolver.class, TagManager.class, tagManager);
 
I would recommend using AemContext to get the ResourceResolver. Only mock objects which you can not adapt from AemContext.
e.g. 
resourceResolver = aemContext.resourceResolver();

2 replies

arunpatidar
Community Advisor
Community Advisor
March 6, 2024

Hi @cheñak11958030 
Could you please check with assertTrue or assertFalse

 

assertTrue("This will succeed.", true);
assertTrue("This will fail!", false);

assertFalse("This will succeed.", false);
assertFalse("This will fail!", true);

 

Example

 

// Verify the response
assertEquals("false", response.getOutputAsString().trim());

import io.wcm.testing.mock.aem.junit5.AemContext; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.apache.sling.servlethelpers.MockSlingHttpServletRequest; import org.apache.sling.servlethelpers.MockSlingHttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import javax.servlet.ServletException; import java.io.IOException; import static org.junit.jupiter.api.Assertions.assertEquals; class YourServletTest { private AemContext context; private YourServlet servlet; @BeforeEach void setUp() { context = new AemContext(); servlet = new YourServlet(); } @Test void testDoGetWithChildren() throws ServletException, IOException { // Set up a mock request with parameters MockSlingHttpServletRequest request = context.request(); request.addParameter("tagName", "yourTagName"); // Set up a mock response MockSlingHttpServletResponse response = context.response(); // Execute the servlet's doGet method servlet.doGet(request, response); // Verify the response assertEquals("true", response.getOutputAsString().trim()); } @Test void testDoGetWithoutChildren() throws ServletException, IOException { // Set up a mock request with parameters MockSlingHttpServletRequest request = context.request(); request.addParameter("tagName", "yourTagName"); // Mock the tag resolution to simulate no children context.currentResource("/content/sample/tag"); // Assuming /content/sample/tag doesn't have children context.registerService(TagManager.class, new MockTagManager()); // Set up a mock response MockSlingHttpServletResponse response = context.response(); // Execute the servlet's doGet method servlet.doGet(request, response); // Verify the response assertEquals("false", response.getOutputAsString().trim()); } // MockTagManager to simulate tag resolution without children private static class MockTagManager implements TagManager { @Override public Tag resolve(String tagId) { return new MockTag(tagId); } @Override public Tag resolve(Resource resource) { return new MockTag(resource.getPath()); } } // MockTag to simulate a tag without children private static class MockTag implements Tag { private final String path; public MockTag(String path) { this.path = path; } @Override public String getPath() { return path; } @Override public String getTitle() { return null; } @Override public String getDescription() { return null; } @Override public String[] getTagID() { return null; } @Override public Iterator<Tag> listChildren() { return Collections.emptyIterator(); } } }

  

 

Arun Patidar
March 6, 2024

hi@arunpatidar thanks for the reply

 

       tried with your solution and its failing at

 

In Servlet:


String tagName = request.getParameter("tagName");
Tag tagPath = Objects.requireNonNull(tagManager).resolve(tagName);
Iterator<Tag> tagChildren = tagPath.listChildren();
String hasChildren = "false";
if (tagChildren.hasNext()) {
hasChildren = "true";
}

 

in Test Case

// Execute the servlet's doGet method
servlet.doGet(request, response);

test case:


import io.wcm.testing.mock.aem.junit5.AemContext;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.apache.sling.servlethelpers.MockSlingHttpServletRequest;
import org.apache.sling.servlethelpers.MockSlingHttpServletResponse;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.io.IOException;
import javax.servlet.ServletException;

class ElasticSearchServletTest {

private AemContext context;
private Servlet servlet;

@BeforeEach
void setUp() {
context = new AemContext();
servlet = new Servlet();
}

@Test
void testDoGetWithChildren() throws ServletException, IOException {
// Set up a mock request with parameters
MockSlingHttpServletRequest request = context.request();
request.addRequestParameter("tagName", "yourTagName");

// Set up a mock response
MockSlingHttpServletResponse response = context.response();

// Execute the servlet's doGet method
servlet.doGet(request, response);

// Verify the response
assertEquals("true", response.getOutputAsString().trim());
}

 

}





 




anupampat
Community Advisor
Community Advisor
March 6, 2024

Can you also share the error where it fails ? I am guessing at  when(resolver.adaptTo(TagManager.class)).thenReturn(tagManager); ? But please share the full error output.

March 6, 2024

hi @anupampat 


Tag tagPath = Objects.requireNonNull(tagManager).resolve(tagName);

in Servlet doGet method 

 




anupampat
Community Advisor
anupampatCommunity AdvisorAccepted solution
Community Advisor
March 6, 2024

I see you have mocked ResourceResolver & then trying to adapt it as TagManager, which will always throw NullPointer.

You will need to make use of AemContext to register the TagManager as an adapter

 e.g. 

aemContext.registerAdapter(ResourceResolver.class, TagManager.class, tagManager);
 
I would recommend using AemContext to get the ResourceResolver. Only mock objects which you can not adapt from AemContext.
e.g. 
resourceResolver = aemContext.resourceResolver();