| 

.NET C# Java Javascript Exception

Unittests von Klassen mit Nicht-Standard-Konstruktor

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Unittests von Klassen mit Nicht-Standard-Konstruktor

lota - 12.12.2007 23:00
Wenn ich einen Unittest für eine Klasse aufrufe, deren Konstruktor Parameter entgegen nimmt, bekomme ich die Fehlermeldung, dass die Klasse nicht instanziert werden könnte.

Beispiel:

Es gibt eine Domain-Klasse "Versuch"
class Versuch{
  String einWert
}
und einen Unit-Test
class VersuchTests extends GroovyTestCase {

    void testSomething() {
			Versuch v = new Versuch(einWert: "hallo")
			assert v.einWert == "hallo"
    }
}
Beim Aufruf von "grails test-app" läuft alles wunderbar.

Ändert man jetzt die Klasse Versuch so, dass sie einen Konstruktor mit Parameter(n) hat, läuft es nicht mehr.
class Versuch { 
	String einWert
	public Versuch(String w){
		einWert = w
	}
}
Ergebnis:
Error running unit tests: org.codehaus.groovy.grails.exceptions.NewInstanceCreationException: Could
not create a new instance of class [Versuch]!
org.codehaus.groovy.grails.exceptions.NewInstanceCreationException: Could not create a new instance of class [Versuch]!

Fügt man der Klasse noch einen leeren Konstruktor hinzu
public Versuch(){}
funktioniert es wieder. Frage: wieso?

Mir ist in Erinnerung, dass eine Java Bean einen leeren Konstruktor braucht, aber ist irgendwo festgelegt, dass Domain-Klassen Java Beans sein müssen? Und selbst wenn das so wäre, wird ja in dem Testfall
new Versuch(einWert: "hallo")
ein Konstruktor mit Parameter aufgerufen und nicht der leere Konstruktor. Das gleiche Verhalten bekommt man übrigens wenn man in der Domain-Klasse bzw. im Testfall auf benannte Parameter verzichtet.

Was passiert mit dem Objekt, das scheinbar mit dem leeren Konstruktor aufgerufen wird? Und wozu wird dieses Objekt überhaupt erzeugt? Es müsste ja zusätzlich noch ein Objekt mit dem parametrisierten Konstruktor erzeugt werden.

Bitte helft mir, das zu verstehen!


Re: Unittests von Klassen mit Nicht-Standard-Konstruktor

lota - 14.12.2007 09:52
Hi rob,

nach dem Stacktrace zu urteilen, hast du mit der Vermutung, dass Reflection verwendet wird, Recht. Nur frage ich mich: wozu? Ich wüsste nicht, wie man auf eine automatisch erzeugte Instanz einer zu testenden Klasse zugreifen könnte und in meinem Beispiel habe ich die Instanz ja auch selbst erzeugt, so wie man es bei einem Unittest außerhalb von Grails machen würde.

Die Frage ist also: welche Magie findet bei Grails-Unittests statt?

lota


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Unittests von Klassen mit Nicht-Standard-Konstruktor" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.