My java application stores your information in MySql database version 8. The user information and password are stored in this database. I am implementing an integration test to test the method that validates the user in the database using dbunit. After the test method runs, the error below occurs.
Caused by: org.dbunit.dataset.NoSuchColumnException: USER.USER_ID - (Non-uppercase input column: USER_ID) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.
I checked through MySql Workbench that both the table and the columns were created in uppercase, so the error message displayed does not make sense. Does anyone know what can be causing this exception?
testContext.xml
unitils.properties
unitils.module.hibernate.enabled=true unitils.module.jpa.enabled=false unitils.module.easymock.enabled=false database.url=jdbc:mysql://192.168.0.12:3306/db_ca?useUnicode=true&characterEncoding=UTF-8&serverTimezone=America/Sao_Paulo database.driverClassName=com.mysql.jdbc.Driver database.userName=root database.password=9999 database.schemaNames=db_main, db_ca database.dialect=mysql unitils.module.database.className=com.myapplication.test.unitils.SingleConnectionDatabaseModule DatabaseModule.Transactional.value.default=disabled DbUnitModule.DataSet.loadStrategy.default=org.unitils.dbunit.datasetloadstrategy.impl.CleanInsertLoadStrategy updateDataBaseSchema.enabled=true dbMaintainer.script.locations=src/test/dbscripts dbMaintainer.autoCreateExecutedScriptsTable=true dbMaintainer.generateDataSetStructure.enabled=false dbMaintainer.preserve.schemas=
In src/test/dbscripts exists the file 001_SCRIPT_01.00.00
SET character_set_client = utf8mb4 ; CREATE TABLE db_ca.ROLE ( ROLE_ID INT(11) NOT NULL AUTO_INCREMENT, NAME VARCHAR(200) NOT NULL, PRIMARY KEY (ROLE_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; SET character_set_client = utf8mb4 ; CREATE TABLE db_ca.USER ( USER_ID INT(11) NOT NULL AUTO_INCREMENT, EMAIL VARCHAR(100) NULL DEFAULT NULL, NAME VARCHAR(150) NOT NULL, PASSWORD VARCHAR(200) NOT NULL, PRIMARY KEY (USER_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; SET character_set_client = utf8mb4 ; CREATE TABLE db_ca.USER_ROLE ( ROLE_ID INT(11) NOT NULL, USER_ID INT(11) NOT NULL, PRIMARY KEY (ROLE_ID, USER_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/datasets/UserServiceTest.xml
<?xml version="1.0" encoding="UTF-8"?> <dataset xmlns="db_ca"> <USER USER_ID = "1" EMAIL = "test@test.com" NAME = "TEST" PASSWORD = "e8d95a51f3af4a3b134bf6bb680a213a" /> <ROLE ROLE_ID = "1" NAME = "ADMIN" /> <USER_ROLE USER_ID = "1" ROLE_ID = "1" /> </dataset>
Entities
@Entity @Table(name = "USER", schema="db_ca") public class User { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="USER_ID", nullable=false) private Long id; ... } @Entity @Table(name = "ROLE", schema="db_ca" ) public class Role { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="ROLE_ID", nullable=false) private Long id; ... }
Class Test AccessServiceIT.java
@DataSet("/datasets/UsuarioServiceTest.xml") @RunWith(UnitilsJUnit4TestClassRunner.class) @SpringApplicationContext("testContext.xml") public class AccessServiceIT { @SpringBean("AccessServiceImpl") private AccessService accessService; @Test public void accessTest() { CredentialsBean credentialsBean = accessService.confirmLogon("test@test.com", "e8d95a51f3af4a3b134bf6bb680a213a"); assertEquals("test@test.com", credentialsBean.getLogon()); assertEquals(true, credentialsBean.isAuthenticated()); } }
Advertisement
Answer
I found the solution to the problem. I just put the following property in unitils.properties and everything is working perfectly fine now.
org.dbunit.database.IMetadataHandler.implClassName=org.dbunit.ext.mysql.MySqlMetadataHandler
I found the solution here https://stackoverflow.com/a/39549867/3554659
I hope it helps who is going through the same mistake.