2020-03-31 20:18:11 +02:00
package com.baeldung.dbunit ;
import org.dbunit.Assertion ;
import org.dbunit.DataSourceBasedDBTestCase ;
import org.dbunit.assertion.DiffCollectingFailureHandler ;
import org.dbunit.assertion.Difference ;
import org.dbunit.dataset.IDataSet ;
import org.dbunit.dataset.ITable ;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder ;
import org.dbunit.operation.DatabaseOperation ;
import org.h2.jdbcx.JdbcDataSource ;
import org.junit.After ;
import org.junit.Before ;
import org.junit.Test ;
import org.junit.platform.commons.logging.Logger ;
import org.junit.platform.commons.logging.LoggerFactory ;
2020-04-03 08:51:46 +02:00
import org.junit.runner.RunWith ;
import org.junit.runners.JUnit4 ;
2020-03-31 20:18:11 +02:00
2020-04-08 08:13:28 +02:00
import javax.sql.DataSource ;
2020-04-01 19:44:48 +02:00
import java.io.InputStream ;
2020-03-31 20:18:11 +02:00
import java.sql.Connection ;
import java.sql.ResultSet ;
import java.sql.SQLException ;
import static com.baeldung.dbunit.ConnectionSettings.JDBC_URL ;
import static java.util.stream.Collectors.joining ;
import static org.assertj.core.api.Assertions.assertThat ;
2020-04-03 08:51:46 +02:00
import static org.dbunit.Assertion.assertEqualsIgnoreCols ;
2020-03-31 20:18:11 +02:00
2020-04-03 08:51:46 +02:00
@RunWith ( JUnit4 . class )
2020-03-31 20:18:11 +02:00
public class DataSourceDBUnitTest extends DataSourceBasedDBTestCase {
2020-04-02 11:20:34 +02:00
private static final Logger logger = LoggerFactory . getLogger ( DataSourceDBUnitTest . class ) ;
@Override
2020-04-08 08:13:28 +02:00
protected DataSource getDataSource ( ) {
2020-04-02 11:20:34 +02:00
JdbcDataSource dataSource = new JdbcDataSource ( ) ;
dataSource . setURL ( JDBC_URL ) ;
dataSource . setUser ( " sa " ) ;
dataSource . setPassword ( " " ) ;
return dataSource ;
}
@Override
protected IDataSet getDataSet ( ) throws Exception {
try ( InputStream resourceAsStream = getClass ( ) . getClassLoader ( ) . getResourceAsStream ( " dbunit/data.xml " ) ) {
return new FlatXmlDataSetBuilder ( ) . build ( resourceAsStream ) ;
2020-04-01 19:44:48 +02:00
}
2020-04-02 11:20:34 +02:00
}
@Override
protected DatabaseOperation getSetUpOperation ( ) {
return DatabaseOperation . REFRESH ;
}
@Override
protected DatabaseOperation getTearDownOperation ( ) {
return DatabaseOperation . DELETE_ALL ;
}
@Before
public void setUp ( ) throws Exception {
super . setUp ( ) ;
}
@After
public void tearDown ( ) throws Exception {
super . tearDown ( ) ;
}
@Test
2020-04-03 08:51:46 +02:00
public void givenDataSet_whenSelect_thenFirstTitleIsGreyTShirt ( ) throws SQLException {
2020-04-02 11:20:34 +02:00
final Connection connection = getDataSource ( ) . getConnection ( ) ;
final ResultSet rs = connection . createStatement ( ) . executeQuery ( " select * from ITEMS where id = 1 " ) ;
assertThat ( rs . next ( ) ) . isTrue ( ) ;
assertThat ( rs . getString ( " title " ) ) . isEqualTo ( " Grey T-Shirt " ) ;
}
@Test
2020-04-03 08:51:46 +02:00
public void givenDataSetEmptySchema_whenDataSetCreated_thenTablesAreEqual ( ) throws Exception {
2020-04-02 11:20:34 +02:00
final IDataSet expectedDataSet = getDataSet ( ) ;
final ITable expectedTable = expectedDataSet . getTable ( " CLIENTS " ) ;
final IDataSet databaseDataSet = getConnection ( ) . createDataSet ( ) ;
final ITable actualTable = databaseDataSet . getTable ( " CLIENTS " ) ;
Assertion . assertEquals ( expectedTable , actualTable ) ;
}
@Test
2020-04-03 08:51:46 +02:00
public void givenDataSet_whenInsert_thenTableHasNewClient ( ) throws Exception {
2020-04-02 11:20:34 +02:00
try ( final InputStream is = getClass ( ) . getClassLoader ( ) . getResourceAsStream ( " dbunit/expected-user.xml " ) ) {
final IDataSet expectedDataSet = new FlatXmlDataSetBuilder ( ) . build ( is ) ;
final ITable expectedTable = expectedDataSet . getTable ( " CLIENTS " ) ;
final Connection conn = getDataSource ( ) . getConnection ( ) ;
2020-04-03 08:51:46 +02:00
conn . createStatement ( )
. executeUpdate (
" INSERT INTO CLIENTS (first_name, last_name) VALUES ('John', 'Jansen') " ) ;
final ITable actualData = getConnection ( )
. createQueryTable (
" result_name " ,
" SELECT * FROM CLIENTS WHERE last_name='Jansen' " ) ;
2020-04-02 11:20:34 +02:00
2020-04-03 08:51:46 +02:00
assertEqualsIgnoreCols ( expectedTable , actualData , new String [ ] { " id " } ) ;
2020-04-01 19:44:48 +02:00
}
2020-04-02 11:20:34 +02:00
}
@Test
2020-04-03 08:51:46 +02:00
public void givenDataSet_whenDelete_thenItemIsDeleted ( ) throws Exception {
final Connection connection = getConnection ( ) . getConnection ( ) ;
try ( final InputStream is = DataSourceDBUnitTest . class . getClassLoader ( ) . getResourceAsStream ( " dbunit/items_exp_delete.xml " ) ) {
ITable expectedTable = ( new FlatXmlDataSetBuilder ( ) . build ( is ) ) . getTable ( " ITEMS " ) ;
connection . createStatement ( ) . executeUpdate ( " delete from ITEMS where id = 2 " ) ;
final IDataSet databaseDataSet = getConnection ( ) . createDataSet ( ) ;
ITable actualTable = databaseDataSet . getTable ( " ITEMS " ) ;
Assertion . assertEquals ( expectedTable , actualTable ) ;
}
}
@Test
public void givenDataSet_whenUpdate_thenItemHasNewName ( ) throws Exception {
final Connection connection = getConnection ( ) . getConnection ( ) ;
try ( final InputStream is = DataSourceDBUnitTest . class . getClassLoader ( ) . getResourceAsStream ( " dbunit/items_exp_rename.xml " ) ) {
ITable expectedTable = ( new FlatXmlDataSetBuilder ( ) . build ( is ) ) . getTable ( " ITEMS " ) ;
connection . createStatement ( ) . executeUpdate ( " update ITEMS set title='new name' where id = 1 " ) ;
final IDataSet databaseDataSet = getConnection ( ) . createDataSet ( ) ;
ITable actualTable = databaseDataSet . getTable ( " ITEMS " ) ;
Assertion . assertEquals ( expectedTable , actualTable ) ;
}
}
@Test
public void givenDataSet_whenInsertUnexpectedData_thenFailOnAllUnexpectedValues ( ) throws Exception {
2020-04-02 11:20:34 +02:00
try ( final InputStream is = getClass ( ) . getClassLoader ( ) . getResourceAsStream ( " dbunit/expected-multiple-failures.xml " ) ) {
final IDataSet expectedDataSet = new FlatXmlDataSetBuilder ( ) . build ( is ) ;
final ITable expectedTable = expectedDataSet . getTable ( " ITEMS " ) ;
final Connection conn = getDataSource ( ) . getConnection ( ) ;
final DiffCollectingFailureHandler collectingHandler = new DiffCollectingFailureHandler ( ) ;
2020-04-03 08:51:46 +02:00
conn . createStatement ( ) . executeUpdate (
" INSERT INTO ITEMS (title, price) VALUES ('Battery', '1000000') " ) ;
2020-04-02 11:20:34 +02:00
final ITable actualData = getConnection ( ) . createDataSet ( ) . getTable ( " ITEMS " ) ;
Assertion . assertEquals ( expectedTable , actualData , collectingHandler ) ;
if ( ! collectingHandler . getDiffList ( ) . isEmpty ( ) ) {
2020-04-03 08:51:46 +02:00
String message = ( String ) collectingHandler
. getDiffList ( )
. stream ( )
. map ( d - > formatDifference ( ( Difference ) d ) ) . collect ( joining ( " \ n " ) ) ;
2020-04-02 11:20:34 +02:00
logger . error ( ( ) - > message ) ;
}
2020-04-01 19:44:48 +02:00
}
2020-04-02 11:20:34 +02:00
}
2020-04-01 19:44:48 +02:00
2020-04-02 11:20:34 +02:00
private static String formatDifference ( Difference diff ) {
return " expected value in " + diff . getExpectedTable ( ) . getTableMetaData ( ) . getTableName ( ) + " . " + diff . getColumnName ( ) + " row " + diff . getRowIndex ( ) + " : " + diff . getExpectedValue ( ) + " , but was: " + diff . getActualValue ( ) ;
}
2020-03-31 20:18:11 +02:00
}