Hi Sascha,
> Meine Testklasse erbt ja von der "Spring-
> Basisklasse" und erzeugt damit den Spring-Container selbst. Deshalb
> kann ich ja auch nicht die DI von Spring in meiner Testklasse nutzen.
Das stimmt leider nicht. Philip hatte Recht: "Du musst nicht aktiv die
Bean holen, sondern auch hier kann der DI Mechanismus von Spring
genutzt werden."
Darueber hinaus, der DI Mechanismus von Spring sollte genau an dieser
Stelle genutzt werden. Das ist eigentlich einer der Hauptziele von den
Spring-Basisklassen!
Deine Klasse leidet von
AbstractTransactionalDataSourceSpringContextTests ab, welche uebrigens
eine Subklasse von AbstractDependencyInjectionSpringContextTests ist.
Direkt aus dem JavaDoc von
AbstractDependencyInjectionSpringContextTests:
Convenient superclass for JUnit 3.8 based tests depending on a Spring
context. The test instance itself is populated by Dependency
Injection.
This supports two modes of populating the test:
- Via Setter Dependency Injection. Simply express dependencies on
objects in the test fixture, and they will be satisfied by autowiring
by type.
- Via Field Injection. Declare protected variables of the required
type which match named beans in the context. This is autowire by name,
rather than type. This approach is based on an approach originated by
Ara Abrahmian. Setter Dependency Injection is the default: set the
populateProtectedVariables property to true in the constructor to
switch on Field Injection.
Uebrigens, welche Version von Spring verwendest du? Wenn du schon auf
2.5.x bist, dann wuerde ich auf jeden Fall empfehlen, das Spring
TestContext Framework zu verwenden, statt die "legacy" JUnit 3.8
Basisklassen. Die alten JUnit 3.8 Basisklassen sind ab Spring 3.0
sowieso "deprecated".
Bezueglich deines Problems, hast du versucht, die Hibernate Session zu
flushen, statt setComplete() aufzurufen? Beim Save muss man
normalerweise nicht flushen, aber ich muesste dein komplett Setup
sehen, um das besser zu analysieren. In HibernateSessionFlushingTests
(Link unten) kannst du ein passendes Beispiel mit Session-Flushing
anschauen. Uebrigens, die assertPersonCount()-Methode habe ich gerade
fuer Dich in der saveJuergenWithDriversLicense()-Methode eingebaut, um
dir zu zeigen, dass es tatsaechlich geht. ;)
https://fisheye.springsource.org/browse/spring-framework/trunk/org.springframework.test/src/test/java/org/springframework/test/context/junit4/orm/HibernateSessionFlushingTests.java?r=HEAD
Viele Erfolg!
Sam