Struts 2 > Home > FAQs > JUnit |

Struts 2
JUnit
Edit Page Browse Space Add Page Add News
Added by ctran, last edited by Ted Husted on Jul 22, 2006 (view change) show comment hide comment
Comment:
Update formatting
View page history

| About JUnit JUnit is a regression testing framework. It is used by the developer who implements unit tests in Java

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.

Taken from Petsoar

    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.

Test for ParametersInterceptor

    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();
        }
    }