Apache Struts 2 Documentation > Home > FAQs > Can we use JUnit with the framework |
![]() | About JUnit JUnit ![]() |
There are several approaches to unit testing SAF-based applications. Two popular techniques are direct Action invocation and testing interceptors and result-types independantly.
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.
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(); } }
Check out the test suites in XWork and SAF. These suites are comprehensive and provide a good starting point. Here's an example.
public void testDoesNotAllowMethodInvocations() { Map params = new HashMap(); params.put("@java.lang.System@exit(1).dummy", "dumb value"); HashMap extraContext = new HashMap(); extraContext.put(ActionContext.PARAMETERS, params); try { ActionProxy proxy = ActionProxyFactory.getFactory(). createActionProxy("", MockConfigurationProvider.MODEL_DRIVEN_PARAM_TEST, extraContext); assertEquals(Action.SUCCESS, proxy.execute()); ModelDrivenAction action = (ModelDrivenAction) proxy.getAction(); TestBean model = (TestBean) action.getModel(); String property = System.getProperty("action.security.test"); assertNull(property); } catch (Exception e) { e.printStackTrace(); fail(); } }