Trudy Cool wrote:
I have to figure out how to get this stuff from the applicationContext.xml into
my tests, correct ....
(end of quote)
I think the "right" way to test these things ("right" meaning the way the
designer's of Spring intended, vs. "right" as in "what works") is to use Spring
services to instantiate all objects, rather than an explicit "new". Either
that, or call an object's Factory's "newInstance()" method. Doing that keeps
your code independent of things (such as how AndroMDA actually names
implementation objects).
I've been slugging through this one also, and I think I've got the answer. May
I point you to the class
org.springframework.test.AbstractTransactionalDataSourceSpringContextTests
found in the "spring-mock.jar" file. Its used for testing of Spring objects.
It will also allow you to use the object context files created by AndroMDA.
Having to create Hibernate sessions directly, as well as transaction managers,
etc. is actually "redundant work", as AndroMDA does most of the work for you.
As you rightly stated, you need to find out how to use the
"applicationContext.xml" file directly. Here is some test code I'm using:
package com.lighthousepmg.kDemo.test;
import com.lighthousepmg.kDemo.AddressBook;
import com.lighthousepmg.kDemo.AddressBookDao;
import com.lighthousepmg.kDemo.Person;
import com.lighthousepmg.kDemo.PersonalEntry;
import
org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
public class KDemoTest extends
AbstractTransactionalDataSourceSpringContextTests {
public void testAddBook() {
AddressBookDao dao =
(AddressBookDao)applicationContext.getBean("addressBookDao");
AddressBook book =
AddressBook.Factory.newInstance();
book.setBookName("My Address Book 3");
book.setIsPrivate(new
Boolean(false));
PersonalEntry entry =
PersonalEntry.Factory.newInstance();
entry.setPerson(Person.newInstance("Joel", "Kozikowski"));
entry.setState("IN");
entry.setStreet("13598 Grapevine
Ln.");
entry.setCity("Fishers");
entry.setZip("46038");
// We must managed BOTH sides of the
association manually (Hibernate requirement)...
book.getContents().add(entry);
entry.getBooks().add(book);
book = dao.create(book);
}
protected String[] getConfigLocations() {
return new String[] {
"applicationContext.xml", "applicationContext-localDataSource.xml" };
}
public static void main(String[] args) {
junit.textui.TestRunner.run(KDemoTest.class);
}
}
Two things of interest:
1) The method getConfigLocations() is declared "abstract" in
AbstractTransactionalDataSourceSpringContextTests, and thus must be
overwritten. You simply specify the name of the Spring config files you want
to use. Both "applicationContext.xml" and
"applicationContext-localDataSource.xml" are created by the AndroMDA Spring
cartridge.
2) AbstractTransactionalDataSourceSpringContextTests has as one of its member
fields an "applicationContext" member, which is basically a BeanFactory (its
other things also, but BeanFactory is one of its interfaces). You should get
your beans by calling the getBean() method using the name found in your
applicationContext.xml. Spring will handle wiring up all the required classes
(including the data source and Hibernate session).
3) I think transaction management is implicit in all calls to your Dao. You
shouldn't have to programatically make any calls to a transaction manager.
AbstractTransactionalDataSourceSpringContextTests DOES have a
"transactionManager" member field, which you can explicitily call "commit()" or
"rollback()", but I found if I called them AFTER my call to dao.create(), I'd
get an error that the transaction was already committed.
4) As a helpful hint - you can create your OWN test database (separate from
working code). Copy the file applicationContext-localDataSource.xml to a file
like applicationContext-test-dataSource.xml, then change all the parameters to
use your test table. Then, simply change the reference in the
getConfigLocations() method, and you'll use your test data source instead.
I'm still playing around with testing, but once I stumbled on this Spring test
class, things got a lot easier.
_________________________________________________________
Reply to the post : http://galaxy.andromda.org/forum/viewtopic.php?p=3853#3853
Posting to http://forum.andromda.org/ is preferred over posting to the mailing
list!
-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
Andromda-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/andromda-user