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