Yup, GenericDispatcher was specifically designed for this situation (well,
and others).

Attached is a base class for unit testing WebWork actions. I use this as the
base for all my action unit tests at work. Just do the following:

public class FooActionTest extends AbstractActionTest {
 public FooActionTest() {
  actionName = "TestFooAction";
  // make sure views.properties has this value
  // ... and is in the classpath for your unit tests
 }

 public void testNoUsernamePassedIntoClass() {
  runActionError();
 }

 public void testGoodUsernamePassedIntoClass() {
  params.put("user", ...);
  FooAction action = (FooAction) runActionSuccess();
  assertEquals("blah", action.getBlah());
 }

}

----- Original Message -----
From: "Simon Stewart" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, October 28, 2002 9:29 AM
Subject: Re: [OS-webwork] Two classes to ease development


> On Monday, Oct 28, 2002, at 16:19 Europe/London, Patrick Lightbody
> wrote:
>
> > I like the StackableActionFactory, I'll make sure it gets in to XWork
> > at
> > least.
>
> Thanks.
>
> > But what is the XAwareActionFactoryProxy exactly for? I do tons of unit
> > testing with my actions (using GenericDispatcher as a launching place)
> > and
> > I've not needed something like this.
>
> The need for something like this arose from a conversation I was having
> about how to unit test webwork actions without needing to fire up a
> complete app server --- a process that takes an age on my machine, and
> therefore acts a significant deterrent to doing "proper" TDD.
>
> The suggested solution was to make use of Mock Objects, which can be
> passed into the Action at test time. So you end up with a chunk of code
> that looks a little like:
>
>      public void testNoUsernamePassedIntoClass() {
>          MockUser user = new MockUser();
>          user.setExpectedSetUsernameCalls( 0 );
>
>          UserEditAction action = new UserEditAction();
>          action.setUser( user );        // Action is UserAware
>          action.setNewUsername( null ); // User name has not been filled
> in
>
>          String result = action.execute();
>          assertEquals( Action.SUCCESS, result );
>          user.verify();
>      }
>
> Obviously, the User class has to be tested elsewhere, but that's
> another problem entirely. Using a style like this, I can run a whole
> test suite in seconds, without having to deploy the app once or go
> through the shenanigans of having a properly configured installation of
> WW[1].
>
> The question remains, however, as to how to get WW to pass in the
> state. As hinted in the snippet of code, one way would be to create an
> interface such as UserAware:
>
>      public interface UserAware {
>          void setUser( User aUser );
>      }
>
> And a matching factory to go with it:
>
>      public class UserAwareFactoryProxy {
>          public static void setUser( Action anAction ) {
>              ActionContext context = ActionContext.getContext();
>              User user = (User)context.getSession().get("currentUser");
>              ((UserAware)action).setUser( user );
>          }
>      }
>
> It would be possible to simply append "User" to the list of factories
> that StackableActionFactory gets to use, but this can become
> inefficient --- not every Action is UserAware --- and doesn't allow one
> to be properly Lazy[2] Instead, the developer has only to state in
> webwork.properties what packages to search through, and
> action.setUser() will be called automagically by
> XAwareActionFactoryProxy if (and only if) the action happens to be
> UserAware, without requiring a potentially enormous custom action
> factory class, and with only a tiny amount of overhead once the first
> invocation is done.
>
> I know that I'm not the only one who thinks like this. Just today,
> Darran Hobbs posted:
>
> "I suppose I prefer the passive bean like approach where state is
> passed in
> from outside, leaving my implementations unaware of anything other than
> their own state and the interfaces they implement.  Its a personal
> style thing I guess.  I've been IOC indoctrinated :)"
>
> If I can do the same "out of container" testing using the
> GenericDispatcher, I would happily do that, especially if it was as
> fast as the method described above, though I am unsure how to set
> things up. Do you have any examples that I could see?
>
> > Also, the *Aware interfaces have been deprecated.
>
> I had noticed the warnings when I compiled webwork from source. What's
> the preferred idiom for passing data into an Action now?
>
> Regards,
>
> Simon
>
> [1] Obviously, the acceptance tests ensure that WW is configured
> properly when the app is deployed.
> [2] In the Perl-ish sense :)
>
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> Opensymphony-webwork mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/opensymphony-webwork

Attachment: AbstractActionTest.java
Description: Binary data

Reply via email to