You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by Matt Ryan <os...@mvryan.org> on 2017/02/01 21:26:39 UTC

[unit testing] Suggestions for unit tests for HtmlRenderer

Hi,

I'm trying to add unit tests for
org.apache.sling.junit.impl.servlet.HtmlRenderer.  However, I'm not sure
the best way to verify that the correct behavior has occurred for the
public methods.  Each public method takes action on a private field - a
PrintWriter instance - but I'm not seeing any public way to inspect that
field or get the output.

One approach I know will work is to use reflection to initialize the
PrintWriter and then to capture the output after calling a method.  This
approach technically will work, but it makes the code brittle.

Other options would be to make the PrintWriter protected, so I can inspect
it from a child class, or add a method to the HtmlRenderer that returns the
contents of the PrintWriter, e.g.

public String render() {
    output.flush();
    return new String(outputStream.getBytes());
}

Any suggestions on the approach from the community?


-MR

Re: [unit testing] Suggestions for unit tests for HtmlRenderer

Posted by Justin Edelson <ju...@justinedelson.com>.
Hi Matt,
IIRC, you need to call the setup method to pass in a response object. The
renderer then gets the writer from the response object.

Regards,
Justin

On Thu, Feb 2, 2017 at 3:57 PM Matt Ryan <os...@mvryan.org> wrote:

> Hi Justin,
>
> Thanks for your reply.  But I'm still not seeing how to go about solving
> this.
>
> Where I get stuck is how to get the HtmlRenderer to use my writer.  It has
> a private PrintWriter field inside it, which as best I can tell is never
> actually initialized.  If I just create a new HtmlRenderer() and then
> invoke one of the methods that makes use of the PrintWriter, I will get a
> NullPointerException because the PrintWriter is null.
>
> I think what you were suggesting is that I do it via an HttpServletResponse
> implementation that uses the HtmlRenderer.  But I still don't have a good
> way to put my PrintWriter into the HtmlRenderer - not without some
> reflection hacks anyway.
>
> What am I missing here?
>
>
> On Wed, Feb 1, 2017 at 3:11 PM, Justin Edelson <ju...@justinedelson.com>
> wrote:
>
> > Hi Matt,
> > Thanks for adding tests!!!
> >
> > What I would suggest is to mock the HttpServletResponse and provide a
> your
> > own StringWriter to response.getWriter().
> >
> > Regards,
> > Justin
> >
> > On Wed, Feb 1, 2017 at 4:26 PM Matt Ryan <os...@mvryan.org> wrote:
> >
> > > Hi,
> > >
> > > I'm trying to add unit tests for
> > > org.apache.sling.junit.impl.servlet.HtmlRenderer.  However, I'm not
> sure
> > > the best way to verify that the correct behavior has occurred for the
> > > public methods.  Each public method takes action on a private field - a
> > > PrintWriter instance - but I'm not seeing any public way to inspect
> that
> > > field or get the output.
> > >
> > > One approach I know will work is to use reflection to initialize the
> > > PrintWriter and then to capture the output after calling a method.
> This
> > > approach technically will work, but it makes the code brittle.
> > >
> > > Other options would be to make the PrintWriter protected, so I can
> > inspect
> > > it from a child class, or add a method to the HtmlRenderer that returns
> > the
> > > contents of the PrintWriter, e.g.
> > >
> > > public String render() {
> > >     output.flush();
> > >     return new String(outputStream.getBytes());
> > > }
> > >
> > > Any suggestions on the approach from the community?
> > >
> > >
> > > -MR
> > >
> >
>

Re: [unit testing] Suggestions for unit tests for HtmlRenderer

Posted by Matt Ryan <os...@mvryan.org>.
Hi Justin,

Thanks for your reply.  But I'm still not seeing how to go about solving
this.

Where I get stuck is how to get the HtmlRenderer to use my writer.  It has
a private PrintWriter field inside it, which as best I can tell is never
actually initialized.  If I just create a new HtmlRenderer() and then
invoke one of the methods that makes use of the PrintWriter, I will get a
NullPointerException because the PrintWriter is null.

I think what you were suggesting is that I do it via an HttpServletResponse
implementation that uses the HtmlRenderer.  But I still don't have a good
way to put my PrintWriter into the HtmlRenderer - not without some
reflection hacks anyway.

What am I missing here?


On Wed, Feb 1, 2017 at 3:11 PM, Justin Edelson <ju...@justinedelson.com>
wrote:

> Hi Matt,
> Thanks for adding tests!!!
>
> What I would suggest is to mock the HttpServletResponse and provide a your
> own StringWriter to response.getWriter().
>
> Regards,
> Justin
>
> On Wed, Feb 1, 2017 at 4:26 PM Matt Ryan <os...@mvryan.org> wrote:
>
> > Hi,
> >
> > I'm trying to add unit tests for
> > org.apache.sling.junit.impl.servlet.HtmlRenderer.  However, I'm not sure
> > the best way to verify that the correct behavior has occurred for the
> > public methods.  Each public method takes action on a private field - a
> > PrintWriter instance - but I'm not seeing any public way to inspect that
> > field or get the output.
> >
> > One approach I know will work is to use reflection to initialize the
> > PrintWriter and then to capture the output after calling a method.  This
> > approach technically will work, but it makes the code brittle.
> >
> > Other options would be to make the PrintWriter protected, so I can
> inspect
> > it from a child class, or add a method to the HtmlRenderer that returns
> the
> > contents of the PrintWriter, e.g.
> >
> > public String render() {
> >     output.flush();
> >     return new String(outputStream.getBytes());
> > }
> >
> > Any suggestions on the approach from the community?
> >
> >
> > -MR
> >
>

Re: [unit testing] Suggestions for unit tests for HtmlRenderer

Posted by Justin Edelson <ju...@justinedelson.com>.
Hi Matt,
Thanks for adding tests!!!

What I would suggest is to mock the HttpServletResponse and provide a your
own StringWriter to response.getWriter().

Regards,
Justin

On Wed, Feb 1, 2017 at 4:26 PM Matt Ryan <os...@mvryan.org> wrote:

> Hi,
>
> I'm trying to add unit tests for
> org.apache.sling.junit.impl.servlet.HtmlRenderer.  However, I'm not sure
> the best way to verify that the correct behavior has occurred for the
> public methods.  Each public method takes action on a private field - a
> PrintWriter instance - but I'm not seeing any public way to inspect that
> field or get the output.
>
> One approach I know will work is to use reflection to initialize the
> PrintWriter and then to capture the output after calling a method.  This
> approach technically will work, but it makes the code brittle.
>
> Other options would be to make the PrintWriter protected, so I can inspect
> it from a child class, or add a method to the HtmlRenderer that returns the
> contents of the PrintWriter, e.g.
>
> public String render() {
>     output.flush();
>     return new String(outputStream.getBytes());
> }
>
> Any suggestions on the approach from the community?
>
>
> -MR
>