Integrationstest für Struts mit Apache Cactus und Jetty
Von Carsten
Ich versuche gerade einen Unit-Test für meine Struts-Actions in einem Servlet-Container zu schreiben. Dazu will ich Cactus und Jetty verwenden. Leider hapert es nach dem Einrichten meines Eclipse-Projekts beim Start der JUnit-Testsuite:
java.lang.NoSuchMethodException: org.mortbay.jetty.nio.SelectChannelConnector.setPort(java.lang.String)
at java.lang.Class.getMethod(Class.java:1078)
at org.apache.cactus.extension.jetty.Jetty6xTestSetup.createServer(Jetty6xTestSetup.java:374)
at org.apache.cactus.extension.jetty.Jetty6xTestSetup.setUp(Jetty6xTestSetup.java:210)
at org.apache.cactus.extension.jetty.Jetty6xTestSetup$1.protect(Jetty6xTestSetup.java:166)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at org.apache.cactus.extension.jetty.Jetty6xTestSetup.run(Jetty6xTestSetup.java:175)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Jetzt bin ich einigermassen verzweifelt, denn die Hilfeseite zum Setup von Cactus und Jetty gibt nicht viel her. Also fange ich ein neues Projekt an und erstelle mir eine simple Action, die einen Parameterstring umkehrt und als Attribut in den Request legt und einen Unit Test dazu. Ausserdem werden einige Properties von Cactus benötigt, um den Servlet-Container hochfahren zu können.
Leider bringt das nicht den gewünschten Erfolg. Damit kann ich im Moment noch gar nichts anfangen. Bis jetzt habe ich meine Junit-Tests immer direkt mit Annotations versehen und konnte sie einfach ausführen. Das Zusammenspiel der TestSuite, des Tests und des Servlet-Containers stimmt anscheinend nicht.
Update Ich habe jetzt versucht, den Unit Test mit Junit 3 auszuführen und das Ergebnis sieht schon anders aus:
java.lang.SecurityException: sealing violation: package org.mortbay.jetty is sealed
at java.net.URLClassLoader.defineClass(URLClassLoader.java:234)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Also geht’s weiter bei Google und Stackoverflow.