AEM Servlet Unit Test | Community
Skip to main content
June 4, 2019

AEM Servlet Unit Test

  • June 4, 2019
  • 5 replies
  • 4450 views

I have the servlet below to use com.adobe.fd.forms.api.FormsService. I'm trying to create a unit test (see below) but I'm getting the following error. It's failing at line 33 of the servlet:

Document xmlDocument = new Document(xmlData.getBytes());

It seems that the servelt is not initialized correctly or messing the references. Can you please help?

Error:

Servlet:

import java.io.IOException;

import javax.servlet.Servlet;

import org.apache.commons.httpclient.HttpStatus;

import org.apache.commons.io.IOUtils;

import org.apache.sling.api.SlingHttpServletRequest;

import org.apache.sling.api.SlingHttpServletResponse;

import org.apache.sling.api.servlets.HttpConstants;

import org.civ.forms.core.services.document.FormsDocumentServices;

import org.osgi.framework.Constants;

import org.osgi.service.component.annotations.Component;

import org.osgi.service.component.annotations.Reference;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.adobe.aemfd.docmanager.Document;

@Component(service = Servlet.class,

property =

{ Constants.SERVICE_DESCRIPTION + "= ",

"sling.servlet.methods=" + HttpConstants.METHOD_POST,

"sling.servlet.paths=/bin/render",

"sling.auth.requirements=/bin/render"

})

public class FormRenderServlet extends org.apache.sling.api.servlets.SlingAllMethodsServlet {

@Reference

private transient FormsDocumentServices documentServices;

private static final String APPLICATION_PDF = "application/pdf";

private final transient Logger logger = LoggerFactory.getLogger(getClass());

@Override

protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {

try {

String xdpName = request.getParameter("xdpname");

String xmlData = request.getParameter("xmldata");

Document xmlDocument = new Document(xmlData.getBytes());

Document renderedPDF = documentServices.render(xdpName, xmlDocument);

String pdfFileName = xdpName.replace(".xdp", ".pdf");

response.setContentType(APPLICATION_PDF);

response.addHeader("Content-Disposition", "attachment; filename=" + pdfFileName);

response.setContentLength((int) renderedPDF.length());

IOUtils.copy(renderedPDF.getInputStream(), response.getOutputStream());

} catch (Exception e) {

response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);

logger.error("reading or writing opertion failed : {}", e);

}

}

}

Test:

import static org.junit.Assert.assertEquals;

import static org.mockito.Mockito.mock;

import static org.mockito.Mockito.when;

import java.io.IOException;

import javax.servlet.ServletException;

import org.apache.sling.api.SlingHttpServletRequest;

import org.apache.sling.api.SlingHttpServletResponse;

import org.apache.sling.testing.mock.sling.junit.SlingContext;

import org.eclipse.jetty.http.HttpStatus;

import org.junit.Rule;

import org.junit.Test;

public class FormRenderServletTest {

    @Rule

    public final SlingContext context = new SlingContext();

    private FormRenderServlet fixture = new FormRenderServlet();

    @Test

    public void doGet() throws ServletException, IOException {

    SlingHttpServletRequest request = mock(SlingHttpServletRequest.class);      

        SlingHttpServletResponse response = mock(SlingHttpServletResponse.class);   

       

        when(request.getParameter("xdpname")).thenReturn("xdpTemplate.xdp");

        when(request.getParameter("xmldata")).thenReturn("");

        fixture.doPost(request, response);

        assertEquals(HttpStatus.OK_200, response.getStatus());

    }

}

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

5 replies

abhinashs680544
August 6, 2019

Hi ihsan, I am facing same issue. Have you find the solution. If yes, please share

narindera257447
August 19, 2019

Use @RunWith(MockitoJUnitRunner.class) on top of your classname since you are using Mockito.

narindera257447
August 19, 2019

Also for third party API , you might need to use Mockito spy just trying having a check on it as well.

August 22, 2019

Hi Narindra, It will be great if you can share the sample code.

abhinash007
August 22, 2019

Hi Everyone,

     You need to add Adobe AEMDS Core Document Manager Support (adobe-aemds-core-docmanager) bundle in classpath or you can add it dependency. This bundle is present in AEM. It will resolve DocumentSourceHandler class