Yeah, I think for the moment I will simply override the getText method. The
other solutions do require much more effort.

Actually I did not search Jira. Maybe there is already a request. I will
take a look.

Thanks,

Paul B.


Laurie Harper wrote:
> 
> As Ian says, the mock objects supplied by XWork may make this all a lot 
> easier, but in any case all this is predicated on the fact that you're 
> using ActionSupport's implementation of TextProvider which doesn't make 
> provision for mocking at test time. I think it would make a great deal 
> of sense to improve that (open an enhancement request in Jira), but in 
> the mean time, there's nothing preventing you from providing a getText() 
> implementation that's more conducive to testing.
> 
> I feel your pain on this one, and the right solution is to fix the 
> framework (patches always welcome ;-), but it shouldn't be that hard to 
> get around.
> 
> L.
> 
> paulbrickell wrote:
>> 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 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(LocalizedTextUtil.java:299)
>>>     at
>>> com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:172)
>>>     at
>>> com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:87)
>>>     at com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:80)
>>>         <SNIP>
>>>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>     at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>     at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.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(MethodRoadie.java:98)
>>>     at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
>>>     at
>>> org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(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(JUnit4ClassRunner.java:51)
>>>     at
>>> org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
>>>     at
>>> org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
>>>     at
>>> org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
>>>     at
>>> org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
>>>     at
>>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
>>>     at
>>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>>>     at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
>>>     at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
>>>     at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
>>>     at
>>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.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--tp13437046p16467812.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]
>>>
>>>
>>>
>> 
> 
> 
> ---------------------------------------------------------------------
> 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--tp13437046p16511240.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]

Reply via email to