Thursday, September 24, 2009

Using DBUnit for unit tests that access a Database

The following test class inserts data into table CODES_TABLE. The data is cleaned out after each test. Existing data in the table is not affected.



package nz.govt.ird.online.ejb.irf.util.helper;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.sql.DataSource;

import nz.govt.ird.online.ejb.irf.util.DataSourceHelper;
import nz.govt.ird.online.ejb.irf.util.helper.CodesTbl.AccLevyRate;

import org.apache.log4j.Logger;
import org.dbunit.DataSourceBasedDBTestCase;
import org.dbunit.database.DatabaseConfig;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.ext.oracle.Oracle10DataTypeFactory;
import org.dbunit.operation.DatabaseOperation;

/**
* Unit tests of {@link CodesTbl}.
*


* Note, you need dbunit-2.4.6.jar, slf4j-api-1.5.8.jar, slf4j-log4j12-1.5.8.jar
* on your classpath.
*
* @author Daniel Nixon
* @author $Author: dznl $
* @version $Revision: 1.1.2.3 $
*/
public class CodesTblTest extends DataSourceBasedDBTestCase {

private static Logger mLogger = Logger.getLogger(CodesTblTest.class);

@Override
protected DataSource getDataSource() {
try {
return DataSourceHelper.getUtestDataSource();
}
catch (SQLException sqlex) {
return null;
}
}

@Override
protected void setUpDatabaseConfig(DatabaseConfig config) {
super.setUpDatabaseConfig(config);

config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
new Oracle10DataTypeFactory());
}

@Override
protected IDataSet getDataSet() throws Exception {

// Test data starts at year 2020

StringBuffer sb = new StringBuffer();
sb.append("");
sb.append("\n");
sb.append("");
sb.append("");

sb.append("");
sb.append("");

sb.append("");
sb.append("");

sb.append("");
sb.append("");

sb.append("");
sb.append("");

sb.append("\n");
sb.append("
");

InputStream is = new ByteArrayInputStream(sb.toString().getBytes());

return new FlatXmlDataSet(is);
}

@Override
protected DatabaseOperation getSetUpOperation() throws Exception {
// We don't want to delete existing data in the database
return DatabaseOperation.REFRESH;
}

@Override
protected DatabaseOperation getTearDownOperation() throws Exception {
// Only cleanout our test data
return DatabaseOperation.DELETE;
}

/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();

}

private static Date getDate(int year, int month, int day) {
Calendar c = GregorianCalendar.getInstance();
c.clear();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month - 1); // Month is zero based in Calendar
c.set(Calendar.DAY_OF_MONTH, day);
return c.getTime();
}

public void testCodesTbl100() throws Exception {

CodesTbl codesTbl = CodesTbl.getInstance(getDataSource().getConnection());

AccLevyRate levyRate = codesTbl.lookupAccLevyRate(getDate(2020, 5, 1));

assertEquals(1.7, levyRate.getRate());
assertEquals(500.00, levyRate.getThreshold());

levyRate = codesTbl.lookupAccLevyRate(getDate(2020, 6, 29));

assertEquals(1.7, levyRate.getRate());
assertEquals(500.00, levyRate.getThreshold());

levyRate = codesTbl.lookupAccLevyRate(getDate(2020, 6, 30));

assertEquals(10.2, levyRate.getRate());
assertEquals(200.0, levyRate.getThreshold());

levyRate = codesTbl.lookupAccLevyRate(getDate(2020, 7, 1));

assertEquals(10.2, levyRate.getRate());
assertEquals(200.0, levyRate.getThreshold());

levyRate = codesTbl.lookupAccLevyRate(getDate(2021, 1, 1));

assertEquals(666.66, levyRate.getRate());
assertEquals(777.77, levyRate.getThreshold());
}

public void testCodesTb200() throws Exception {

CodesTbl codesTbl = CodesTbl.getInstance(getDataSource().getConnection());

double maxTaxCredits = codesTbl.calcMaximumClaimableTaxCreditsForPayrollDonations(
getDate(2021, 12, 31), 1000, 10000, 20);

assertEquals(2.0, maxTaxCredits);

maxTaxCredits = codesTbl.calcMaximumClaimableTaxCreditsForPayrollDonations(
getDate(2021, 12, 31), 1000, 20000, 20);

assertEquals(0.0, maxTaxCredits);
}

}