I have a UserService:
public class UserServiceImpl implements UserService {
private Session session;
public UserServiceImpl(@InjectService("Session")Session session) {
this.session = session;
}
public void save(User user) {
session.save(user);
}
}
I bind this in the AppModule, and then I can use it in any page or
component class. This is great.
Now for unit testing my UserService, I make my own RegistryBuilder as
others have recommended, and can do a test:
@BeforeClass
protected void setup() {
RegistryBuilder builder = new RegistryBuilder();
builder.add(HibernateModule.class);
builder.add(SetupForTest.class);
builder.add(AppModule.class);
Registry registry = builder.build();
registry.performRegistryStartup();
userService = registry.getService("userService",
UserService.class);
}
@Test
public void testAddUsers() throws Exception {
User user = createRandomUser();
userService.save(user);
List<User> users = userService.getUsers();
assertEquals(1, users.size());
}
Now, the first problem is that this will not be committed to the
database, when you have hibernate configured with autocommit=false.
To
accomplish that, I need to grab the session out of the registry and
add this:
@AfterClass
protected void closeSession() throws Exception {
session.getTransaction().commit();
session.close();
}
I would have thought that Tapestry-hibernate would take care of that
(it does when run as a webapp, so no real problem here), given it is
supposed to commit or rollback when the thread ends (in this case the
thread is running all the tests).
My real question comes when I want to test some of the constraints on
my database. For instance, there is a unique constraint on the
username in the User class. So a test might be:
@Test
public void testAddUsersWithSameUsernames() throws Exception {
User user = createRandomUser("woodj");
userService.save(user);
User duplicateUser = createRandomUser("woodj");
try {
userService.save(duplicateUser);
Assert.fail("Should have thrown exception with duplicate
username constraint exception.");
} catch (HibernateException e) {
//success
}
}
Now when this test is run I get a failure (don't flush the Session
after an exception occurs), because of my closeSession method. I can
remove the closeSession, which shouldn't really be there anyway, and
everything passes, but I don't get the additional comfort of checking
my db to make sure hibernate synched things up properly.
I can rollback manually in the exception, by getting the current txn
from the session service, but I get the same failure. It seems that
no
matter what you do, once an exception is thrown, and regardless of
how
you handle it, that session is done.
I've also tried all the aforementioned, but using the
HibernateSessionManager service to grab the session, which should
allow me to commit and abort midsession, but it suffers the exact
same
failures, despite it's assurance in the javadoc:
Manages the Hibernate session for the current thread. This includes
creating the session as
needed, allowing the session to checkpoint (commit the current
transaction and continue) and
commit the transaction automatically at the end of the request.
So my question is: can I test my services, under the
HibernateSessionManager, and have the flexibility to commit and
rollback midsession? It seems not, but maybe I missed something.
And just BTW, if I create my own SessionFactory and handle the
session
and txn's myself, everything works as expected.
Thanks for any thoughts.
J
On Feb 4, 2008, at 8:01 AM, Davor Hrg wrote:
HibernateSessionManager handles session for a request,
and does commit at the end.
if you want to have more than one commit you should not call it
directly on the injected session since it will confuse
HibernateSessionManager.
Same goes for rollback.
Davor Hrg
On Feb 4, 2008 3:52 PM, Angelo Chen <[EMAIL PROTECTED]>
wrote:
hi,
I have used Session session in my app and it works, I have seen
HibernateSessionManager being mentioned many times in the list,
what are the
advantages of using HibernateSessionManager compared app which does
not
explicitly use it?
Thanks,
Angelo
--
View this message in context:
http://www.nabble.com/T5%3A-HibernateSessionManager-tp15268872p15268872.html
Sent from the Tapestry - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]