Skip to main content
New Participant
June 4, 2019

AEM Servlet Unit Test

  • June 4, 2019
  • 5 replies
  • 4453 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

abhinash007
New Participant
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

New Participant
August 22, 2019

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

narindera257447
New Participant
August 19, 2019

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

narindera257447
New Participant
August 19, 2019

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

abhinashs680544
New Participant
August 6, 2019

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