From 8e0abdfcbc798c8ed0f85af1f641d58d341fe83a Mon Sep 17 00:00:00 2001
From: Tharre <tharre3@gmail.com>
Date: Mon, 21 May 2018 15:21:43 +0200
Subject: JdbcTestCase changed to work with Junit 4

---
 .../employee/EmployeePersistenceTest.java          |   2 +-
 .../assignment/groupphase/util/JdbcTestCase.java   | 101 +++++++++++++++++++--
 2 files changed, 92 insertions(+), 11 deletions(-)

(limited to 'src/test/java/at')

diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeePersistenceTest.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeePersistenceTest.java
index d4f5646..71af3bd 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeePersistenceTest.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/employee/EmployeePersistenceTest.java
@@ -19,7 +19,7 @@ public class EmployeePersistenceTest extends JdbcTestCase {
     private EmployeeDAO employeePersistence;
 
     public EmployeePersistenceTest() throws PersistenceException {
-        employeePersistence = new EmployeeDatabaseDao(jdbcConnectionManager);
+        employeePersistence = new EmployeeDatabaseDao(getJdbcConnectionManager());
     }
 
     @Override
diff --git a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
index 5390841..dae93ff 100644
--- a/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
+++ b/src/test/java/at/ac/tuwien/sepm/assignment/groupphase/util/JdbcTestCase.java
@@ -1,30 +1,87 @@
 package at.ac.tuwien.sepm.assignment.groupphase.util;
 
+import java.lang.invoke.MethodHandles;
+import java.sql.SQLException;
 import java.sql.Types;
-import org.dbunit.DBTestCase;
-import org.dbunit.PropertiesBasedJdbcDatabaseTester;
+import org.dbunit.DefaultDatabaseTester;
+import org.dbunit.IDatabaseTester;
+import org.dbunit.IOperationListener;
 import org.dbunit.database.DatabaseConfig;
+import org.dbunit.database.DatabaseConnection;
+import org.dbunit.database.IDatabaseConnection;
+import org.dbunit.dataset.IDataSet;
 import org.dbunit.dataset.datatype.DataType;
 import org.dbunit.dataset.datatype.DataTypeException;
 import org.dbunit.ext.postgresql.PostgresqlDataTypeFactory;
+import org.dbunit.operation.DatabaseOperation;
+import org.junit.After;
+import org.junit.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
 
-public abstract class JdbcTestCase extends DBTestCase {
+@Component
+public abstract class JdbcTestCase {
 
-    private static final String JDBC_DRIVER = "org.h2.Driver";
+    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
     private static final String JDBC_URL =
             "jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:sql/database.sql'";
 
-    protected final JDBCConnectionManager jdbcConnectionManager;
+    private IDatabaseTester dbTester;
+    private IDatabaseConnection connection;
+    private IOperationListener operationListener;
+    private JDBCConnectionManager jdbcConnectionManager;
 
     protected JdbcTestCase() {
-        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, JDBC_DRIVER);
-        System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, JDBC_URL);
-
         jdbcConnectionManager = new JDBCConnectionManager(JDBC_URL);
     }
 
-    @Override
-    protected void setUpDatabaseConfig(DatabaseConfig config) {
+    protected abstract IDataSet getDataSet() throws Exception;
+
+    protected JDBCConnectionManager getJdbcConnectionManager() {
+        return jdbcConnectionManager;
+    }
+
+    protected IDatabaseConnection getConnection() throws Exception {
+        if (connection == null)
+            connection = new DatabaseConnection(jdbcConnectionManager.getConnection(), null, true);
+
+        return connection;
+    }
+
+    private IOperationListener getOperationListener() {
+        if (operationListener == null) {
+            operationListener =
+                    new IOperationListener() {
+                        @Override
+                        public void connectionRetrieved(IDatabaseConnection connection) {
+                            setUpDatabaseConfig(connection.getConfig());
+                        }
+
+                        @Override
+                        public void operationSetUpFinished(IDatabaseConnection connection) {
+                            LOG.debug("operationSetUpFinished(connection={}) - start", connection);
+                        }
+
+                        @Override
+                        public void operationTearDownFinished(IDatabaseConnection connection) {
+                            LOG.debug(
+                                    "operationTearDownFinished(connection={}) - start", connection);
+                            try {
+                                connection.close();
+                            } catch (SQLException e) {
+                                LOG.error("Failed to close connection:" + e);
+                                e.printStackTrace();
+                            }
+                        }
+                    };
+        }
+
+        return operationListener;
+    }
+
+    // override DBUnit's enum handling
+    private void setUpDatabaseConfig(DatabaseConfig config) {
         PostgresqlDataTypeFactory factory =
                 new PostgresqlDataTypeFactory() {
                     @Override
@@ -47,4 +104,28 @@ public abstract class JdbcTestCase extends DBTestCase {
 
         config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, factory);
     }
+
+    @Before
+    public void setUp() throws Exception {
+        IDataSet dataSet = getDataSet();
+
+        dbTester = new DefaultDatabaseTester(getConnection());
+        getOperationListener().connectionRetrieved(getConnection());
+
+        dbTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
+        dbTester.setTearDownOperation(DatabaseOperation.NONE);
+        dbTester.setDataSet(dataSet);
+        dbTester.setOperationListener(getOperationListener());
+        dbTester.onSetup();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        try {
+            dbTester.onTearDown();
+            getConnection().close();
+        } finally {
+            dbTester = null;
+        }
+    }
 }
-- 
cgit v1.2.3-70-g09d2