package com.processpuzzle.litest.template; import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext; import com.processpuzzle.application.domain.ConfigurableApplicationFixture; import com.processpuzzle.commons.generics.GenericTypeParameterInvestigator; import com.processpuzzle.commons.persistence.AggregateRoot; import com.processpuzzle.commons.persistence.Entity; import com.processpuzzle.commons.persistence.Repository; import com.processpuzzle.litest.template.GenericTemplatedFixture; import com.processpuzzle.persistence.domain.DefaultUnitOfWork; import com.processpuzzle.persistence.domain.EntityFactory; public abstract class FactoryTestFixture<S extends EntityFactory<E>, E extends Entity> extends GenericTemplatedFixture<S> { private ConfigurableApplicationFixture applicationFixture; protected ProcessPuzzleContext applicationContext; protected S factory; //Properties public ProcessPuzzleContext getApplicationContext(){ return applicationContext; } //Protected, private helper methods protected FactoryTestFixture( FactoryTestEnvironment<S, ?> testEnvironment ) { super( testEnvironment ); this.applicationFixture = testEnvironment.getApplicationFixture(); } @SuppressWarnings("unchecked") @Override protected void configureBeforeSutInstantiation() { Class<? extends Entity> entityClass = (Class<? extends Entity>) GenericTypeParameterInvestigator.getTypeParameter( this.getClass(), 1 ); applicationContext = applicationFixture.getApplicationContext(); factory = (S) applicationContext.getEntityFactoryByEntityClass( entityClass ); } @Override protected S instantiateSUT() { return factory; } @Override protected void releaseResources() { } @SuppressWarnings("unchecked") protected void saveAggregateRoot( AggregateRoot aggregateRoot ) { @SuppressWarnings( "rawtypes" ) Repository repository = applicationContext.getRepositoryByEntityClass( aggregateRoot.getClass() ); DefaultUnitOfWork work = new DefaultUnitOfWork( true ); repository.add( work, aggregateRoot ); work.finish(); } @SuppressWarnings("unchecked") protected void deleteAggregateRoot( AggregateRoot aggregateRoot ) { @SuppressWarnings( "rawtypes" ) Repository repository = applicationContext.getRepositoryByEntityClass( aggregateRoot.getClass() ); DefaultUnitOfWork work = new DefaultUnitOfWork( true ); repository.delete( work, aggregateRoot ); work.finish(); } }