Embedded Jetty und MyFaces

Status
Nicht offen für weitere Antworten.

cinteX

Mitglied
Hiho,

habe hier ein sehr fieses Problem.

Zunächst mal die Grundlagen:
Ich habe eine WebApplication welche ich mit MyFaces 1.2.7 laufen habe.
Nun möchte ich gern für einige Klassen UnitTests schreiben.

Soviel zu den Grundlagen. Mein Problem liegt darin, das ich für diese UnitTests (welche ich mit HtmlUnits abhandeln möchte) einen Server benötige, auf dem die Application im Testmodus läuft.

Hierfür habe ich mir Jetty inkl des Maven-Jetty-Plugins (fürs bauen der app).
Was auch wunderbar funktioniert, sobald ich die Tests über die Kommandozeile starte, wird der Jetty-Server hochgefahren und die Tests laufen durch.

Wenn ich allerdings die Tests aus Eclipse herraus starten möchte, brauch ich diesen Server auch, der wiederrum nicht automatisch (wie in der pom.xml definiert) gestartet wird. Hierzu haben ich mir folgenden Embedded Code erstellt, der mir einen WebServer starten soll (natürlich mit den normalen Einstellungen aus der web.xml, wie als wenn ich ihn von hand in der Kommandozeile starten würde).

Hier erstmal der Code:
Java:
public class TestServer
{
	private static Server _server;
	
	public static void startServer() throws Exception
	{
		if(_server == null)
		{
		    _server = new Server(8888);
		    WebAppContext webapp = new WebAppContext(_server, "src/main/webapp", "/yp-webapp");
		    ServletHolder facesServlet = new ServletHolder(new FacesServlet());
		    facesServlet.setInitOrder(1);
		    webapp.addServlet(facesServlet, "*.jsf");
		    _server.addHandler(webapp);
		    webapp.getServer().start();
		}
	}
}

Mein Problem liegt darin, dass der MayFaces context nicht initalisiert werden kann.
Hier der Fehler der geworfen wird:

Code:
java.lang.IllegalStateException: No Factories configured for this Application. This 
happens if the faces-initialization does not work at all - make sure that you properly
 include all configuration settings necessary for a basic faces application and that all 
the necessary libs are included. Also check the logging output of your web application and your container for any exceptions!
If you did that and find nothing, the mistake might be due to the fact that you use 
some special web-containers which do not support registering context-listeners via
 TLD files and a context listener is not setup in your web.xml.
A typical config looks like this;
<listener>
  <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>

Den Ursprung des Fehlers konnte ich auch schon Lokalisieren.
Während der Initalisierung des Contextes wird irgendwann eine Klasse namens FactoryFinder aufgerufen in welcher verschiedene Factories beinhaltet, eben auch die Factory für den Faces-Context.

Problem hierbei, die Variable _registeredFactoryNames ist leer.
Somit kann kein FacesContext erstellt werden und die Abarbeitung endet in obigen Fehlermeldung.

Wie gesagt wenn ich den Server von hand start: mvn jetty:run (oder einfach den Tomcat starte auf dem die Webapp auf meine Produktionsumgebung läuft) läuft alles wie geschmiert.

Ich hoffe man kann mir helfen.
grüße cinteX
 
M

maki

Gast
Was du da machst (Server starten für Unittests) fällt unter Integrationstests, dafür sollte man immmer ein eigenes Maven Modul nutzen und nicht versuchen die Integrationstests in dem eigentlichen Modul/pom zu missbrauchen.

Dann solltest du den Server explizit starten, dafür gibt es eine Reihe von Plugins, ich fand früher das Cargo plugin sehr gut, kann auch mehr als das Tomcat oder Jetty plugin.
 

cinteX

Mitglied
Wenn du mir noch erklärst wie das funktioniert wäre ich dir sehr verbunden.
Also das ich den jetty server aus der console raus starte funktioniert ja schon, kein problem.

Nur will ich halt zb das dann währen ich zb: mvn test ausführe, mein eclipse im debug aufgeht.
 
M

maki

Gast
Wenn du mir noch erklärst wie das funktioniert wäre ich dir sehr verbunden.
Debuggen läuft doch immer gleich ab in so einem Falle... den Debug Button nutzen...

Also das ich den jetty server aus der console raus starte funktioniert ja schon, kein problem.
ja, aber dass das nicht gut ist hatte ich doch schon gesagt, oder?

Warum den Server überhaupt in Java starten für die Tests, wenn es doch soviele Plugins gibt...
 

cinteX

Mitglied
ja, aber dass das nicht gut ist hatte ich doch schon gesagt, oder?

Warum den Server überhaupt in Java starten für die Tests, wenn es doch soviele Plugins gibt...

da hast du mich glaube ich etwas falsch verstanden.
ich habe das jetty-maven-plugin hier installiert.

und durch jetty:run wird der servergestartet und die htmlunit tests laufen dann durch.
soweit hab ich dein anliegen verstanden.

was ich halt brauche ist das ich zb:
mvn test
aufrufe und halt dieser testvorgang an den im eclipse gesetzten breakpoints anhällt, was ich nich weis ob es geht und wenn doch, wie genau
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben