diff --git a/navalplanner-business/pom.xml b/navalplanner-business/pom.xml index 86f5850bd..e6e0a400b 100644 --- a/navalplanner-business/pom.xml +++ b/navalplanner-business/pom.xml @@ -72,5 +72,17 @@ joda-time joda-time-hibernate + + org.dbunit + dbunit + + + log4j + log4j + + + org.slf4j + slf4j-simple + \ No newline at end of file diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/AbstractDBUnitTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/AbstractDBUnitTest.java new file mode 100644 index 000000000..cda1faa2a --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/AbstractDBUnitTest.java @@ -0,0 +1,22 @@ +package org.navalplanner.business.common.test.dbunit; + +import static org.navalplanner.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE; +import static org.navalplanner.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE; +import static org.navalplanner.business.test.BusinessGlobalNames.DBUNIT_CONFIG_TEST_FILE; + +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@TestExecutionListeners( { DependencyInjectionTestExecutionListener.class, + DBUnitTestExecutionListener.class }) +@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, + BUSINESS_SPRING_CONFIG_TEST_FILE }) +@DBUnitConfiguration(locations = DBUNIT_CONFIG_TEST_FILE) +@Transactional +public abstract class AbstractDBUnitTest { +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/DBUnitConfiguration.java b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/DBUnitConfiguration.java new file mode 100644 index 000000000..96fb9636b --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/DBUnitConfiguration.java @@ -0,0 +1,35 @@ +package org.navalplanner.business.common.test.dbunit; + +import java.lang.annotation.*; + +/** + *

+ * The DBUnitConfiguration annotation defines class-level metadata used + * to provide DBUnit configuration data to an instance of {@link DBUnitTestExecutionListener}. + *

+ * + * @author Bob McCune + * @version 1.0, 4/1/2008 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Inherited +@Documented +public @interface DBUnitConfiguration { + + /** + * The DBUnit data set configuration file locations. + * + * @return the location of the DBUnit data set configuration files + */ + String[] locations() default {}; + + /** + * The DBUnit DataSet type of the configuration files. If not specified the default will be assumed to be + * {@link org.dbunit.dataset.xml.XmlDataSet}. + * + * @return the data set type of the configuration files + */ + Class type() default org.dbunit.dataset.xml.XmlDataSet.class; + +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/DBUnitTestExecutionListener.java b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/DBUnitTestExecutionListener.java new file mode 100644 index 000000000..9c07a0a21 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/DBUnitTestExecutionListener.java @@ -0,0 +1,119 @@ +package org.navalplanner.business.common.test.dbunit; + +import java.io.InputStream; +import java.lang.reflect.Constructor; +import java.sql.Connection; +import java.util.Map; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.dbunit.database.DatabaseConfig; +import org.dbunit.database.DatabaseConnection; +import org.dbunit.database.IDatabaseConnection; +import org.dbunit.dataset.IDataSet; +import org.dbunit.operation.DatabaseOperation; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.jdbc.datasource.DataSourceUtils; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.transaction.TransactionalTestExecutionListener; + +/** + * A Spring @{TestExecutionListener} used to integrate the functionality of + * DBUnit. + * + * @author Bob McCune + * @version 1.0 + */ +public class DBUnitTestExecutionListener extends + TransactionalTestExecutionListener { + + private static final Log logger = LogFactory + .getLog(DBUnitTestExecutionListener.class); + + private static final String DEFAULT_DATASOURCE_NAME = "dataSource"; + private static final String TABLE_TYPES[] = { "TABLE", "ALIAS" }; + + @Override + public void beforeTestMethod(TestContext testContext) throws Exception { + + super.beforeTestMethod(testContext); + + DataSource dataSource = getDataSource(testContext); + Connection conn = DataSourceUtils.getConnection(dataSource); + IDatabaseConnection dbUnitConn = getDBUnitConnection(conn); + try { + IDataSet dataSets[] = getDataSets(testContext); + for (IDataSet dataSet : dataSets) { + DatabaseOperation.CLEAN_INSERT.execute(dbUnitConn, dataSet); + logger.info("Performed CLEAN_INSERT of IDataSet."); + } + } finally { + DataSourceUtils.releaseConnection(conn, dataSource); + } + } + + private DataSource getDataSource(TestContext context) throws Exception { + DataSource dataSource; + Map beans = context.getApplicationContext().getBeansOfType( + DataSource.class); + if (beans.size() > 1) { + dataSource = (DataSource) beans.get(DEFAULT_DATASOURCE_NAME); + if (dataSource == null) { + throw new NoSuchBeanDefinitionException( + "Unable to locate default data source."); + } + } else { + dataSource = (DataSource) beans.values().iterator().next(); + } + return dataSource; + } + + private IDatabaseConnection getDBUnitConnection(Connection c) + throws Exception { + IDatabaseConnection conn = new DatabaseConnection(c); + DatabaseConfig config = conn.getConfig(); + config.setFeature("http://www.dbunit.org/features/qualifiedTableNames", + true); + config.setProperty("http://www.dbunit.org/properties/tableType", + TABLE_TYPES); + return conn; + } + + private IDataSet[] getDataSets(TestContext context) throws Exception { + String dataFiles[] = getDataLocations(context); + IDataSet dataSets[] = new IDataSet[dataFiles.length]; + for (int i = 0; i < dataFiles.length; i++) { + Resource resource = new ClassPathResource(dataFiles[i]); + Class clazz = getDataSetType(context); + Constructor con = clazz.getConstructor(InputStream.class); + dataSets[i] = (IDataSet) con.newInstance(resource.getInputStream()); + } + return dataSets; + } + + protected Class getDataSetType(TestContext context) { + Class testClass = context.getTestClass(); + DBUnitConfiguration config = testClass + .getAnnotation(DBUnitConfiguration.class); + return config.type(); + } + + private String[] getDataLocations(TestContext context) { + Class testClass = context.getTestClass(); + DBUnitConfiguration config = testClass + .getAnnotation(DBUnitConfiguration.class); + if (config == null) { + throw new IllegalStateException("Test class '" + testClass + + " has is missing @DBUnitConfiguration annotation."); + } + if (config.locations().length == 0) { + throw new IllegalStateException( + "@DBUnitConfiguration annotation doesn't specify any DBUnit configuration locations."); + } + return config.locations(); + } +} \ No newline at end of file diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/ExampleDBUnitTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/ExampleDBUnitTest.java new file mode 100644 index 000000000..30cd5be42 --- /dev/null +++ b/navalplanner-business/src/test/java/org/navalplanner/business/common/test/dbunit/ExampleDBUnitTest.java @@ -0,0 +1,21 @@ +package org.navalplanner.business.common.test.dbunit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.navalplanner.business.advance.daos.IAdvanceTypeDAO; +import org.navalplanner.business.advance.entities.AdvanceType; +import org.springframework.beans.factory.annotation.Autowired; + +public class ExampleDBUnitTest extends AbstractDBUnitTest { + + @Autowired + private IAdvanceTypeDAO advanceDAO; + + @Test + public void percentageInsertedInDB() { + AdvanceType advance = advanceDAO.findByName("percentage"); + assertEquals("percentage",advance.getUnitName()); + } + +} diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/BusinessGlobalNames.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/BusinessGlobalNames.java index cb3bae3de..8cd25435b 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/BusinessGlobalNames.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/BusinessGlobalNames.java @@ -31,6 +31,7 @@ public class BusinessGlobalNames { public final static String BUSINESS_SPRING_CONFIG_TEST_FILE = "classpath:/navalplanner-business-spring-config-test.xml"; + public final static String DBUNIT_CONFIG_TEST_FILE = + "/dbunit-data.xml"; private BusinessGlobalNames () {} - } diff --git a/navalplanner-business/src/test/resources/dbunit-data.xml b/navalplanner-business/src/test/resources/dbunit-data.xml new file mode 100644 index 000000000..bba84b74b --- /dev/null +++ b/navalplanner-business/src/test/resources/dbunit-data.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + id + version + unitname + defaultmaxvalue + updatable + unitprecision + active + percentage + + + 1 + 1 + percentage + 100 + true + 0.01 + true + true + + +
+ +
+ + diff --git a/navalplanner-business/src/test/resources/log4j.properties b/navalplanner-business/src/test/resources/log4j.properties new file mode 100644 index 000000000..28d664592 --- /dev/null +++ b/navalplanner-business/src/test/resources/log4j.properties @@ -0,0 +1,10 @@ +# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml! +# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J. +log4j.rootLogger=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +log4j.logger.org.springframework=WARN +log4j.logger.org.hibernate=WARN diff --git a/pom.xml b/pom.xml index a8d5f84a5..246d83878 100644 --- a/pom.xml +++ b/pom.xml @@ -361,6 +361,21 @@ navalplanner-business 1.0.0 + + org.dbunit + dbunit + 2.4.6 + + + log4j + log4j + 1.2.14 + + + org.slf4j + slf4j-simple + 1.5.5 + javax.servlet servlet-api