package com.smartitengineering.cms.repo.dao.impl.tx; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.TypeLiteral; import com.smartitengineering.cms.repo.dao.tx.Transaction; import com.smartitengineering.cms.repo.dao.tx.TransactionManager; import com.smartitengineering.dao.common.CommonDao; import com.smartitengineering.dao.common.CommonReadDao; import com.smartitengineering.dao.common.CommonWriteDao; import org.jmock.Expectations; import org.jmock.Mockery; import org.junit.Before; import org.junit.Test; /** * * @author imyousuf */ public class DeclarativeTransactionTest { private static class Services { private final CommonDao<DemoDomain, String> cmnDao; private final CommonReadDao<DemoDomain, String> readDao; private final CommonWriteDao<DemoDomain> writeDao; @Inject public Services(CommonDao<DemoDomain, String> cmnDao, CommonReadDao<DemoDomain, String> readDao, CommonWriteDao<DemoDomain> writeDao) { this.cmnDao = cmnDao; this.readDao = readDao; this.writeDao = writeDao; } } private Mockery mockery; private CommonReadDao<DemoDomain, String> readDao; private CommonWriteDao<DemoDomain> writeDao; private Injector injector; private Services services; private TransactionManager manager; @Before public void setup() { mockery = new Mockery(); readDao = mockery.mock(CommonReadDao.class); writeDao = mockery.mock(CommonWriteDao.class); injector = Guice.createInjector(new DemoDomainMasterModule(new AbstractModule() { @Override protected void configure() { bind(new TypeLiteral<Class<DemoDomain>>() { }).toInstance(DemoDomain.class); bind(new TypeLiteral<CommonWriteDao<DemoDomain>>() { }).annotatedWith(Transactionable.class).toInstance(writeDao); bind(new TypeLiteral<CommonReadDao<DemoDomain, String>>() { }).annotatedWith(Transactionable.class).toInstance(readDao); bind(Services.class); } })); services = injector.getInstance(Services.class); manager = injector.getInstance(TransactionManager.class); } @Test public void testDecalarativeCommit() { Transaction tx = manager.beginTransaction(); try { final DemoDomain d1 = new DemoDomain(); services.writeDao.save(d1); mockery.checking(new Expectations() { { exactly(1).of(writeDao).save(d1); } }); tx.commit(); mockery.assertIsSatisfied(); } catch (Exception ex) { tx.rollback(); } } @Test public void testDecalarativeRollback() { Transaction tx = manager.beginTransaction(); try { final DemoDomain d1 = new DemoDomain(); services.writeDao.save(d1); throw new NullPointerException(); } catch (Exception ex) { tx.rollback(); } } }