I found an article on how to statically load Tiles to get past the container issue. I found a web site that explained how to initialize the tiles container. See below:

<snip>
   protected void setUp() throws Exception {
       if (applicationContext == null) {
           // this is the first time so initialize Spring context
           servletContext = new MockServletContext();
           servletContext.addInitParameter(
                   ContextLoader.CONFIG_LOCATION_PARAM, CONFIG_LOCATIONS);
           applicationContext = (new ContextLoader())
                   .initWebApplicationContext(servletContext);

           // Struts JSP support servlet (for Freemarker)
new JspSupportServlet().init(new MockServletConfig(servletContext));

           // Below is the fix I needed.

           // Statically configuring tiles since we do not load it from the
           // web.xml for tests.
           servletContext.addInitParameter(
                   BasicTilesContainer.DEFINITIONS_CONFIG,
                   "/WEB-INF/tiles-def-test.xml");
final StrutsTilesListener tilesListener = new StrutsTilesListener();
           final ServletContextEvent event = new ServletContextEvent(
                   servletContext);
           tilesListener.contextInitialized(event);
       }
.....
</snip>

Timothy Astle wrote:
Thanks for the tip Greg. I quickly went through the debugger based on the example here: http://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/

and I learned two things.

1. execute() does call getSettings(). All that CRUD nonsense was me not being sure it was actually calling the method I wanted because it threw an exception upon execution.

2. It looks like adding the following to the createAction(..) method fixed my first problem. I had an interceptor putting a variable on the session, but no session was set, triggering a NullPointerException.

proxy.getInvocation().getInvocationContext().setSession(new HashMap());

Now I'm just running into a problem where the TilesAccess.getContainer(servletContext) is returning a null. This is in the org.apache.struts2.views.tiles.TilesResult class.

public void doExecute(String location, ActionInvocation invocation) throws Exception {
        setLocation(location);

ServletContext servletContext = ServletActionContext.getServletContext(); TilesContainer container = TilesAccess.getContainer(servletContext);

        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();

// fails because the container is null
        container.render(location, request, response);
    }

I will post my final results when I get that part figured out. If someone can offer a tip, I'd appreciate it. I'm learning as I go here.

Tim


Greg Lindholm wrote:
You can take a look at this:

http://glindholm.wordpress.com/2008/06/30/unit-testing-struts-2-actions/

I've used it to unit test actions all the way through interceptors,
validation, actions, and results including freemarker result types.


Timothy Astle wrote:
I had tried using proxy.execute(), which will use Struts. Maybe that's where I'm a bit lost. I don't implement execute() because of my CRUD approach.

Can someone point me to some appropriate struts 2 junit tests so I can figure this out?






---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to