Dustin, Many thanks for the info. I will try as soon as I find the time for this! Josep
2010/12/15 DUSTIN PEARCE <dustin_pea...@yahoo.com> > Ok. Josep. This is what we are using today. Pasting this in the email > seems long, but.... > > @ContextConfiguration(loader=StrutsContextLoader.class , locations = > {"classpath:/applicationContext-resources.xml", > "classpath:/applicationContext-CrowdClient.xml" > ,"classpath:/applicationContext-dao.xml" > ,"classpath:/applicationContext-service.xml" > ,"classpath:/applicationContext-web.xml" > ,"classpath:/applicationContext.xml" > ,"/WEB-INF/security.xml" }) > @TransactionConfiguration(transactionManager = > "transactionManager",defaultRollback = true) > > @Transactional > public abstract class BaseStrutsTestCase extends > AbstractTransactionalJUnit4SpringContextTests{ > protected MockHttpServletRequest request; > protected MockHttpServletResponse response; > private Dispatcher dispatcher; > protected ActionProxy proxy; > WebApplicationContext context; > > @Before > public void onSetUpBeforeTransaction() throws Exception { > request = new MockHttpServletRequest(); > response = new MockHttpServletResponse(); > context = (WebApplicationContext)applicationContext; > HashMap params = new HashMap(); > dispatcher = new Dispatcher(context.getServletContext(), params); > dispatcher.init(); > Dispatcher.setInstance(dispatcher); > > } > > @After > public void onTearDownAfterTransaction() throws Exception{ > request = null; > response = null; > context = null; > dispatcher = null; > proxy = null; > } > > > protected <T> T createAction(String namespace, String name) > throws Exception { > Map extraContext = dispatcher.createContextMap(request, response, > null, context.getServletContext()); > proxy = > dispatcher.getContainer().getInstance(ActionProxyFactory.class). > createActionProxy( > namespace, name, null,extraContext, true, false); > proxy.getInvocation().getInvocationContext(). > setSession(new HashMap()); > //set to false when using convention plugin > proxy.setExecuteResult(false); > ServletActionContext.setContext( > proxy.getInvocation().getInvocationContext()); > > ServletActionContext.setServletContext(context.getServletContext()); > return (T) proxy.getAction(); > } > > public void setUpMockSecurityManager(RootAction action, User user) { > MockSecurityService securityService = (MockSecurityService) > context.getBean("mockSecurityService"); > if (user != null) > securityService.setUser(user); > action.setSecurityService(securityService); > } > > And then we use: > > public class StrutsContextLoader extends AbstractContextLoader { > static final Log log = > LogFactory.getLog(StrutsContextLoader.class); > public ApplicationContext loadContext(String... locations) throws > Exception { > MockServletContext servletContext = new > MockServletContext("/src/main/webapp/",new FileSystemResourceLoader()); > > servletContext.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, > arrayToString(locations, ",")); > return (new > ContextLoader()).initWebApplicationContext(servletContext); > } > > protected String getResourceSuffix() { > return null; > } > > public static String arrayToString(String[] a, String separator) { > StringBuffer result = new StringBuffer(); > if (a.length > 0) { > result.append(a[0]); > for (int i = 1; i < a.length; i++) { > result.append(separator); > result.append(a[i]); > } > } > return result.toString(); > } > > } > > And here is an example of a Unit Test: > public class EventControllerTest extends BaseStrutsTestCase { > private static final Log log = > LogFactory.getLog(EventControllerTest.class); > > EventController controller; > > @Autowired > EventMessageQueue eventMessageQueue; > > @Autowired > EventService eventService; > > @Test > public void create() throws Exception { > request.setParameter("event.name", "Test Event"); > request.setParameter("event.shortDescription", "Short > Description"); > request.setParameter("event.summaryText", "Summary Text"); > request.setParameter("event.longDescription", "Long Description"); > request.setParameter("event.department", "Cardiology"); > request.setParameter("event.subjects", "Healthy Heart"); > request.setParameter("event.subjects", "Cancer Institute"); > request.setParameter("event.preRequisites", "Text Pre-requisites"); > request.setParameter("event.cost", "25.00"); > request.setParameter("event.maxRegistrations", "25"); > request.setParameter("event.contactPhone", "925-222-2321"); > request.setParameter("event.contactEmail", "em...@email.com"); > request.setParameter("event.schedulingType", "STANDARD"); > controller = createAction("/events", "create"); > String result = proxy.execute(); > Assert.assertEquals("success", result); > Assert.assertNotNull(controller.getEvent().getId()); > boolean foundOurMessage = false; > Long messageIdToFind = controller.getEvent().getId(); > while (eventMessageQueue.size() > 0) { > EventMessage message = eventMessageQueue.pop(); > log.debug("Processing message : " + > message.getEvent().getId()); > if (message.getEvent().getId() == messageIdToFind) > foundOurMessage = true; > } > Assert.assertTrue("Couldn't find our message in the queue.", > foundOurMessage); > } > > @Test > public void update() throws Exception { > request.setParameter("event.id", "1"); > request.setParameter("event.name", "New Name"); > controller = createAction("/events", "update"); > String result = proxy.execute(); > Assert.assertEquals("success", result); > Assert.assertEquals("New Name", controller.getEvent().getName()); > } > } > > So the general usage is: > > Setup your request. > Create your action > proxy.execute() > Inspect the action for changes after the call > > Note: > In BaseStrutsTestCase the line: > proxy.setExecuteResult(false); > if set to true will make sure your results are there. We had problems with > it and the Convention plugin a while ago so we set it false. We don't > really need that level of testing here since all of the views are tested via > Selenium anyways. > > SecurityManager is specific to our application and its integration with > Crowd so it doesn't do anything for your needs. > > -D > > On Dec 14, 2010, at 7:19 AM, Josep García wrote: > > This seems to be based on servletunit and it looks like it only supports > Struts 1.x. > > I'd like to write a test like: > > public void testSearchByBondName() throws Exception { > HashMap params = new HashMap(); > > ActionProxy proxy = createActionProxy(NAMESPACE, ACTION, parrams); > assertEquals("success", proxy.invoke()); > assertTrue(action.getActionErrors().isEmpty()); > } > > I was trying some solutions for this, based on what I found on the net, > like: > > http://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/ > > but with no luck when accessing the persistent objects in my actions. > > org.hibernate.LazyInitializationException: could not initialize proxy - no > Session > at > org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57) > at > org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111) > at > org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150) > > Incidentally, I found a org.apache.struts2.StrutsTestCase class, but there > seems to be no examples on how to use it. > > Josep > > 2010/12/14 Matt Raible <m...@raibledesigns.com> > >> >> >> On Tue, Dec 14, 2010 at 5:47 AM, Josep García <jgar...@isigma.es> wrote: >> >>> I have found this while doing some search: >>> >>> >>> /** >>> * This class is extended by all ActionTests. It basically >>> * contains common methods that they might use. >>> * >>> * <p> >>> * <a href="BaseStrutsTestCase.java.html"><i>View Source</i></a> >>> * >>> * @author <a href="mailto:m...@raibledesigns.com">Matt Raible</a> >>> */ >>> public abstract class BaseStrutsTestCase extends MockStrutsTestCase { >>> >>> However, in my AppFuse 2.0.2, ActionTests extend BaseActionTestCase. This >>> lacks the possibility of testing action messages, struts validation, etc. >>> >>> Where is this appfuse BaseStrutsTestCase availble? Can it be used to test >>> struts validation and so on? >>> >> >> Yes, you should be able to test these things. What does your test case >> look like and what's not working? >> >> >> > >