...
There are several approaches to unit testing SAF-based applications. Two popular techniques are direct Action invocation and testing interceptors and result-types independantly.
Direct Action Invocation
The simplest approach is to instantiate your Actions, call the appropriate setters, then invoke execute
. Calling the Action directly allows you to bypass all the complicated container setup.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package org.petsoar.actions.inventory; import com.mockobjects.constraint.IsEqual; import com.mockobjects.dynamic.C; import com.mockobjects.dynamic.Mock; import com.opensymphony.xwork.Action; import junit.framework.TestCase; import org.petsoar.pets.Pet; import org.petsoar.pets.PetStore; public class TestViewPet extends TestCase { private Mock mockPetStore; private ViewPet action; protected void setUp() throws Exception { mockPetStore = new Mock(PetStore.class); PetStore petStore = (PetStore) mockPetStore.proxy(); action = new ViewPet(); action.setPetStore(petStore); } public void testViewPet() throws Exception { Pet existingPet = new Pet(); existingPet.setName("harry"); existingPet.setId(1); Pet expectedPet = new Pet(); expectedPet.setName("harry"); expectedPet.setId(1); mockPetStore.expectAndReturn("getPet", C.args(new IsEqual(new Long(1))), existingPet); action.setId(1); String result = action.execute(); assertEquals(Action.SUCCESS, result); assertEquals(expectedPet, existingPet); mockPetStore.verify(); } public void testViewPetNoId() throws Exception { mockPetStore.expectAndReturn("getPet", C.ANY_ARGS, null); String result = action.execute(); assertEquals(Action.ERROR, result); assertEquals(1, action.getActionErrors().size()); assertEquals("Invalid pet selected.", action.getActionErrors().iterator().next()); assertNull(action.getPet()); mockPetStore.verify(); } public void testViewPetInvalidId() throws Exception { action.setId(-1); testViewPetNoId(); } } |
Testing Interceptors and/or Result Types
Check out the test suites in XWork and SAF. These suites are comprehensive and provide a good starting point. Here's an example.
...