# Testen von Struts-Anwendung



## pymote (29. Sep 2006)

Hallo,

hat jemand Erfahrung mit dem Testen von Struts-Anwendungen? Ich versuche mich gerade mit StrutsTestCase 2.1.3. scheitere aber schon bei anfänglichen Versuchen meine Action-Klassen zu testen. Soweit ich das verstanden habe, erwartet die Test-Klasse die execute-Methoden meiner Action-Klassen. Diese erben allerdings von MappingDispatchAction und irgendwie gelingt es mir nicht die einzelnen Methoden zu testen. Gibt es andere Möglichkeiten?


----------



## clemson (29. Sep 2006)

hmm, dann zeig mal ein bisschen code...

ich verwende bei meinem web projekt das struts test case framework und find' es ganz fein zum testen von struts...


----------



## pymote (29. Sep 2006)

ok, bin schon ein bisschen weitergekommen:

meine Action-Klasse:


```
public class MyActionDispatcher extends MappingDispatchAction{

	public ActionForward anmelden(ActionMapping mapping,
		            ActionForm form,
		            HttpServletRequest request,
		            HttpServletResponse response) {
		
		ActionForward actionForward = mapping.findForward("valid");

		return actionForward;
	}
}
```

Auszug aus der struts-config.xml


```
<action path="/anmelden"
         type="action.MyActionDispatcher"
         scope="session"
         name="DatenForm"
         parameter="anmelden"
         input="page.anmelden"
         validate="true" >
      <forward name="valid" path="/doSomething.do" />
</action>
```

und schliesslich meine Test-Klasse


```
import java.io.File;
import servletunit.struts.MockStrutsTestCase;

public class TestLibrary extends MockStrutsTestCase {

    public TestLibrary(String testName) {
        super(testName);
    }

    protected void setUp() {
    	try {
			super.setUp();
		} catch (Exception e) {
			e.printStackTrace();
		}
    	setContextDirectory(new File("WebRoot"));
    }
    
	public void testAnmelden() throws Exception {

		setRequestPathInfo("/anmelden");
		actionPerform();
		verifyForward("valid");
	}
}
```

Die Methode anmelden() sollte eigentlich nur das Forward ("valid") weitergeben. Ich bekomme allerdings diese fehlermeldung:


```
junit.framework.AssertionFailedError: was expecting '/doSomething.do' but received '/jsp/tiles/tilesBase.jsp'
at servletunit.struts.Common.verifyForwardPath(Common.java:339)
at servletunit.struts.MockStrutsTestCase.verifyForward(MockStrutsTestCase.java:675)
at test.TestLibrary.testAnmelden(TestLibrary.java:26)
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 junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
```


----------



## clemson (29. Sep 2006)

hmm, probier mal verfiyForwardPath("/doSomething.do")...


----------



## pymote (29. Sep 2006)

dann bekomm ich folgenden Fehler:


```
junit.framework.AssertionFailedError: was expecting '/doSomething.do' but received '/jsp/tiles/tilesBase.jsp'
	at servletunit.struts.MockStrutsTestCase.verifyForwardPath(MockStrutsTestCase.java:713)
	at test.TestLibrary.testAnmelden(TestLibrary.java:26)
	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 junit.framework.TestCase.runTest(TestCase.java:154)
	at junit.framework.TestCase.runBare(TestCase.java:127)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at junit.framework.TestSuite.runTest(TestSuite.java:208)
	at junit.framework.TestSuite.run(TestSuite.java:203)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
```

liegt wahrscheinlich an Tiles


----------



## clemson (29. Sep 2006)

hmm, es gibt auch die verifyTilesForward methode...


----------



## pymote (29. Sep 2006)

da muss ich aber als zweites argument ne tiles-definition angeben. die hab ich aber für eine action (doSomething.do) natürlich nicht.


----------



## clemson (29. Sep 2006)

irgendwie hat das strutstestcase ja auch recht mit der aussage, dass der pfad nicht übereinstimmt. ich denke, dass strutstestcase löst den action-forward /doSomething.do auf, und vergleicht dann mit dem wirklichen pfad an den weitergeleitet wird.

er soll ja auch an die tilesBase.jsp weiterleiten, oder? bzw. wie schaut die action definition von doSomething aus?


----------

