And did you investigate using either of the common Java frameworks for
Mock objects, jMock and EasyMock? 

> -----Original Message-----
> From: paulbrickell [mailto:[EMAIL PROTECTED] 
> Sent: Friday, April 04, 2008 3:04 AM
> To: user@struts.apache.org
> Subject: RE: any struts 2 unit testers out there?
> 
> 
> Actually thats an interesting post. To my mind it doesn't 
> demonstrate a solution. It demonstrates the problem.
> 
> Here is why I think this.
> 
> Struts 2 is just frankly brilliant for people doing test 
> first development.
> The classes you create really are POJOs. There are no 
> dependencies on any framework in my action classes. For 
> example parameters are parsed well away from my action and 
> the values are set using simple properties, things like 
> sessions are simply maps. It is a truly new world for those 
> of who have suffered the horror of mocking http requests, 
> responses, context and the like.
> 
> But this simple scenario brings all that pain flooding back. 
> I add a line in my action like this...
> 
> String yadaYada = getText("some.doodad");
> 
> And my lovely world comes unraveled real quick. Now I need 
> mock objects up the ying-yang.
> 
> I started using the tutorial from the link posted (I am an 
> Arsenal fan btw, so got two for the price of one, thanks), 
> but it still doesn't provide a simple solution to the 
> problem. To get this to work I have to build not just the 
> application context but a mass of supporting objects to get a 
> (partial) web application framework up and running before I 
> can test my simple POJO.
> 
> I am not going to give up just yet, but I think I am still 
> going to have to look for another way.
> 
> Cheers,
> Paul B.
> 
> 
> 
> 
> Relph,Brian wrote:
> > 
> > 
> > I recommend creating an action context.  Here is the basic guide I 
> > followed to do so:
> > 
> > 
> http://arsenalist.com/2007/06/18/unit-testing-struts-2-actions-spring-
> > junit/
> > 
> > If you are not using spring or the struts2 spring plugin, 
> you can cut 
> > out all the code around the applicationContext.
> > 
> > 
> > -----Original Message-----
> > From: paulbrickell [mailto:[EMAIL PROTECTED]
> > Sent: Thursday, April 03, 2008 11:44 AM
> > To: user@struts.apache.org
> > Subject: Re: any struts 2 unit testers out there?
> > 
> > 
> > I am trying to deal with the same issue. Did you get any resolution?
> > 
> > Following on from the reply asking for a stack trace, here 
> is what I 
> > am getting...
> > 
> > 
> > java.lang.NullPointerException
> >     at
> > 
> com.opensymphony.xwork2.util.LocalizedTextUtil.findText(Locali
> zedTextUtil.java:299)
> >     at
> > 
> com.opensymphony.xwork2.TextProviderSupport.getText(TextProvid
> erSupport.java:172)
> >     at
> > 
> com.opensymphony.xwork2.TextProviderSupport.getText(TextProvid
> erSupport.java:87)
> >     at 
> com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:80)
> >         <SNIP>
> >     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >     at
> > 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccess
> orImpl.java:39)
> >     at
> > 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMeth
> odAccessorImpl.java:25)
> >     at java.lang.reflect.Method.invoke(Method.java:585)
> >     at 
> org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
> >     at
> > 
> org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRo
> adie.java:98)
> >     at 
> org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
> >     at
> > 
> org.junit.internal.runners.MethodRoadie.runBeforesThenTestThen
> Afters(MethodRoadie.java:87)
> >     at 
> org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
> >     at 
> org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
> >     at
> > 
> org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(
> JUnit4ClassRunner.java:88)
> >     at
> > 
> org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4
> ClassRunner.java:51)
> >     at
> > 
> org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4Class
Runner.java:44)
> >     at
> > 
> org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoa
> die.java:27)
> >     at
> > 
> org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadi
> e.java:37)
> >     at
> > 
> org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRu
> nner.java:42)
> >     at
> > 
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
> (JUnit4TestReference.java:38)
> >     at
> > 
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestEx
> ecution.java:38)
> >     at
> > 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTest
> s(RemoteTestRunner.java:460)
> >     at
> > 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTest
> s(RemoteTestRunner.java:673)
> >     at
> > 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(Rem
> oteTestRunner.java:386)
> >     at
> > 
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTest
> > Runner.java:196)
> > 
> > 
> > It is caused by ActionContext.getContext() returning null. Quite 
> > obviously I do not have an action context during my unit testing.
> > 
> > Now I can certainly use the ActionContext.setContext() in my tests 
> > setup method to push one into thread local storage and that 
> works OK. 
> > It isn't ideal though because ActionContext is a concrete 
> class and so 
> > my choices then become a bit limited.
> > 
> > I could create an instance but when I try this I find I 
> have to create 
> > a rather large object model to make it actually work. To the point 
> > where I despair and give up.
> > 
> > Alternatively I could use a mock library (like easy mock). But I am 
> > not inclined to include a mocking library that requires byte code 
> > rewriting (not even for testing).
> > 
> > What I really want to do is inject a text provider into the 
> > ActionSupport class. At the top of the ActionSupport class 
> is this...
> > 
> > private final transient TextProvider textProvider = new 
> > TextProviderFactory().createInstance(getClass(), this);
> > 
> > Damn its final and so I cannot inject my own text provider. 
> > 
> > BUT it uses a factory, thats good. I know I will have a look at the 
> > factory I bet I can monkey with that and inject a mock. 
> Nope. It's all 
> > instance based. No way I can get in there. And thats that. 
> Now what do 
> > I do?
> > 
> > I can see two (half) workable solutions.
> > 
> > One is to override the the getText method in the action 
> class when I 
> > instantiate it during testing. So I end up doing this in 
> all my action 
> > unit tests...
> > 
> >         Action action = new MyAction()
> >         {
> >             @Override
> >             public String getText(String textName)
> >             {
> >                 return "mocked";
> >             }
> >         };
> > 
> > It works, but its cheese.
> > 
> > Or two I can add a level of indirection in my action class, 
> like so...
> > 
> > 
> >     String text =
> > 
> MyTextProviderFactory.getInstance(class.name).getText("some.property")
> > ;
> > 
> > Then I can use a delegate to the real text provider during 
> live code 
> > and a mock of my own text provider during testing. The 
> question here 
> > is, Why for the love of Pete, why?
> > 
> > So in conclusion there are at least four options for testing Action 
> > classes that use get text.
> > 
> > 1. Build an action context by hand. (Too hard) 2. Use a class 
> > rewriting mocking library. (Not on my watch) 3. Mock the get text 
> > method. (Cheese) 4. Add another level of indirection. (Man 
> thats just 
> > annoying)
> > 
> > Comments?
> > 
> > BTW If you got this far, thanks for taking the time.
> > Paul B.
> > 
> > 
> > 
> > 
> > Session Mwamufiya wrote:
> >> 
> >> Hi All,
> >> 
> >> Would someone let me know whether it's possible to tweak 
> something so 
> >> that JUnit test code can run on an action method that calls the 
> >> ActionSupport method getText() to fetch string resources from a 
> >> package.properties file.
> >> As it stands, I keep getting a null exception when getText() is 
> >> called during the unit test.
> >> 
> >> Thanks,
> >> Session
> >> 
> >> 
> >> 
> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> For additional commands, e-mail: [EMAIL PROTECTED]
> >> 
> >> 
> >> 
> > 
> > --
> > View this message in context:
> > 
> http://www.nabble.com/any-struts-2-unit-testers-out-there--tp13437046p
> > 16467812.html Sent from the Struts - User mailing list archive at 
> > Nabble.com.
> > 
> > 
> > 
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > 
> > 
> ----------------------------------------------------------------------
> > CONFIDENTIALITY NOTICE This message and any included 
> attachments are 
> > from Cerner Corporation and are intended only for the 
> addressee. The 
> > information contained in this message is confidential and may 
> > constitute inside or non-public information under international, 
> > federal, or state securities laws. Unauthorized forwarding, 
> printing, 
> > copying, distribution, or use of such information is strictly 
> > prohibited and may be unlawful. If you are not the 
> addressee, please 
> > promptly delete this message and notify the sender of the delivery 
> > error by e-mail or you may call Cerner's corporate offices 
> in Kansas City, Missouri, U.S.A at (+1) (816)221-1024.
> > 
> > 
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > 
> > 
> > 
> 
> --
> View this message in context: 
> http://www.nabble.com/any-struts-2-unit-testers-out-there--tp1
3437046p16490696.html
> Sent from the Struts - User mailing list archive at Nabble.com.
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to