SeamTest ist eine Klasse, die wir für die Tests erweitern, die wir in unserer Seam-Anwendung schreiben. Sie stellt die Seam-Umgebung in Tests zur Verfügung, ähnlich wie WicketTester in der Wicket-Anwendung. Ich möchte einige Informationen über die Einstellung der Eigenschaft der Session-Bean weitergeben, die ich bei der Verwendung von SeamTest erfahren habe.
Schauen wir uns den folgenden Code an.
@Staatenlos
@Scope(ScopeType.SESSION)
@Name("Etwas")
public class SomethingBean implementiert Something {
@Logger
private Log log;
@In
StatusMessages statusMessages;
@In
Benutzer Benutzer;
@In
public String test;
@Aus
boolean invoked = false;
@Aus
String userName = "Kein Name";
public String something() {
log.info("Aktion Something.something() aufgerufen");
statusMessages.add("etwas");
aufgerufen = true;
userName = user.getName();
Test zurückgeben;
}
}
Und die testClass :
public class SomethingTest extends SeamTest {
@Test
public void test_something() throws Exception {
new FacesRequest() {
@Override
protected void invokeApplication() {
setValue("#{user.name}", "user");
setValue("#{Something.test}", "testValue");
// Contexts.getSessionContext().set("test", "testValue");
Object result = invokeMethod("#{Something.something}");
Object object = Contexts.getSessionContext().get("invoked");
Assert.assertTrue((Boolean) object);
Assert.assertEquals(Contexts.getSessionContext().get("userName")), "user");
Assert.assertEquals(result, "testWert");
}
}.run();
}
}
Mit der Methode setValue() von SeamTest können wir die Eigenschaft der Entity bean User setzen. ABER als ich versucht habe, die Methode SetValue() zu verwenden, um die Eigenschaft 'test' auf 'Something' (Session bean) zu setzen, erhalte ich den folgenden Stacktrace. java.lang.AssertionError: javax.el.PropertyNotFoundException: Die Klasse 'org.javassist.tmp.java.lang.Object_$$_javassist1' hat die Eigenschaft 'test' nicht. at org.jboss.seam.mock.AbstractSeamTest$Request.onException(AbstractSeamTest.java:455) Offensichtlich versucht Seam, die Eigenschaft 'test' in einer anderen Klasse "org.javassist.tmp.java.lang.Object$$_javassist_1" zu finden. Dies ist die vom Seam-Framework erzeugte Proxy-Klasse. Die Proxy-Klasse hat die gleiche Schnittstelle wie die Session-Bean 'Something'. Sie verfügt nicht über die Eigenschaft 'test', da die Schnittstelle die Getter und Setter nicht deklariert. Die Entity Bean 'user' wird vom Seam Framework anders behandelt: Es wird kein Proxy erstellt, daher kann die Eigenschaft mit
setValue("#{user.name}", "user");
Wenn wir also im Test die Eigenschaft für die Session Bean nicht so einstellen können, wie stellt Seam sie dann in der Produktion ein? Seam sucht nach der @In-Eigenschaft im entsprechenden Kontext, wenn die Eigenschaft nicht angegeben ist. Und wenn sie im Kontext vorhanden ist, wird sie gesetzt. Die Lösung besteht darin, den Wert der Eigenschaft auf den entsprechenden Kontext zu setzen. In Ihrem Seam-Test könnten Sie zum Beispiel verwenden,
Contexts.getSessionContext().set("test", "testValue").
Die andere Möglichkeit besteht darin, den Getter und Setter für die Eigenschaft in der @Local-Schnittstelle zu haben, die von der Session Bean implementiert wird. Auf diese Weise ist der Getter und Setter der Eigenschaft in der generierten Proxy-Klasse vorhanden und wir können , setValue(Something.test, "testValue") verwenden, um die Eigenschaft von test zu setzen. Dies würde jedoch die Injektion der Eigenschaft unterbrechen. Die Eigenschaft wird nicht im Kontext nachgeschlagen und wir erhalten die Fehlermeldung "@In attribute requires non-null value: Something.test" In einigen Szenarien, in denen die Eigenschaft nicht mit @In annotiert ist, können wir die vorherige Option verwenden.
Verfasst von
Sunil Prakash Inteti
Unsere Ideen
Weitere Blogs
Contact



