[英]Unitils database exception
In my project I am using JDBC, MySQL, Servlets, JSP.在我的项目中,我使用 JDBC、MySQL、Servlets、JSP。 To test my dao's i made some unit tests and i am trying to use JUnit and Unitils.
为了测试我的 dao,我做了一些单元测试,我正在尝试使用 JUnit 和 Unitils。
I am getting this exception:我收到此异常:
org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void com.jean.taxi.daoImpl.ClientDaoImplTest.testListModerators()
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:190)
at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:791)
at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:273)
at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:181)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:59)
at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:42)
at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:60)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:67)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.NullPointerException
at java.lang.String.startsWith(String.java:1385)
at java.lang.String.startsWith(String.java:1414)
at org.unitils.core.dbsupport.MySqlDbSupport.toCorrectCaseIdentifier(MySqlDbSupport.java:189)
at org.unitils.core.dbsupport.DbSupport.init(DbSupport.java:97)
at org.unitils.core.dbsupport.DbSupportFactory.getDbSupport(DbSupportFactory.java:77)
at org.unitils.core.dbsupport.DbSupportFactory.getDefaultDbSupport(DbSupportFactory.java:56)
at org.unitils.dbunit.DbUnitModule.getDefaultDbSupport(DbUnitModule.java:755)
at org.unitils.dbunit.DbUnitModule.getDataSetFactory(DbUnitModule.java:725)
at org.unitils.dbunit.DbUnitModule.getDataSetFactory(DbUnitModule.java:713)
at org.unitils.dbunit.DbUnitModule.getDataSet(DbUnitModule.java:441)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:261)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:187)
... 21 more
My unitils-local.propreties:我的 unitils-local.propreties:
database.userName=root
database.password=111111
database.storedIndentifierCase.mysql=mixed_case
dbUnit.datasetresolver.prefixWithPackageName=false
database.identifierQuoteString.mysql=none
database.schemaNames=TEST
database.dialect=mysql
database.driverClassName=com.mysql.jdbc.Driver
My unitils.properties:我的 unitils.properties:
# Name or path of the user specific properties file. This file should contain the necessary parameters to connect to the
# developer's own unit test schema. It is recommended to override the name of this file in the project specific properties
# file, to include the name of the project. The system will try to find this file in the classpath, the user home folder
# (recommended) or the local filesystem.
unitils.configuration.localFileName=unitils-local.properties
# Properties for the PropertiesDataSourceFactory
database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/test
database.schemaNames=test
# This property specifies the underlying DBMS implementation. Supported values are 'oracle', 'db2', 'mysql' and 'hsqldb'.
# The value of this property defines which vendor specific implementations of DbSupport and ConstraintsDisabler are chosen.
dbUnit.datasetresolver.prefixWithPackageName=false
My dataset options:我的数据集选项:
<?xml version="1.0" encoding="UTF-8"?>
<dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CLIENT ID="1" CLIENT_NAME="clientName" CLIENT_LAST_NAME="clientLastName"
EMAIL="email" ADDRESS="address" PASSWORD="password"
PHONE="phone" SECOND_PHONE="secondPhone" THIRD_PHONE="thirdPhone" CREATE_DATE="2015-10-05 08:35:25"/>
<CLIENT_GRANT ID="1" ID_CLIENT="1" ADMIN="0" MODERATOR="0" ACTIVE="1"/>
</dataset>
And some part of my test-dao class, which i am trying to test:以及我正在尝试测试的 test-dao 类的某些部分:
@Transactional(TransactionMode.ROLLBACK)
@DataSet("ClientDaoImplTest.xml")
public class ClientDaoImplTest extends UnitilsJUnit4 {
@TestDataSource
DataSource dataSource;
ClientDaoImpl clientDao = null;
ClientGrantDaoImpl clientGrantDao = null;
@Before
public void init() {
clientDao = new ClientDaoImpl(dataSource);
clientGrantDao = new ClientGrantDaoImpl(dataSource);
TransactionHandlerImpl.setDataSource(dataSource);
clientDao.setCurrentLocalConnection(ConnectionHolder.getLocalConnection());
clientGrantDao.setCurrentLocalConnection(ConnectionHolder.getLocalConnection());
}
@After
public void destroy() {
clientDao = null;
clientGrantDao = null;
}
@Test
public void testAddNew() {
final User user = new User();
user.setEmail("email");
user.setAddress("address");
user.setPassword("password");
user.setClientName("clientName");
user.setClientLastName("clientLastName");
user.setPhone("phone");
final ClientGrant clientGrant = user.getClientGrant();
clientGrant.setClientId(user.getId());
clientGrant.setActive(true);
user.setClientGrant(clientGrant);
executeTest(new Transaction<Long>() {
@Override
public void doTransaction() throws Exception {
Long clientId = clientDao.addNew(user);
user.setId(clientId);
clientGrantDao.addNew(user.getClientGrant());
assertTrue(assertClient(clientDao.get(clientId), user));
}
});
}
I know that something wrong with my database options.我知道我的数据库选项有问题。 Can you help me to find the way how to fix this issue?
你能帮我找到解决这个问题的方法吗? Thanks.
谢谢。
UPDATE: after changing the parameter in my unitils-local.properties: from:更新:更改我的 unitils-local.properties 中的参数后:来自:
database.identifierQuoteString.mysql=none
to:到:
database.identifierQuoteString.mysql=auto
a had a new exception: a 有一个新的例外:
org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void com.jean.taxi.daoImpl.ClientDaoImplTest.testAddNew()
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:190)
at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:791)
at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:273)
at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:181)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:59)
at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:42)
at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:60)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:67)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: org.unitils.core.UnitilsException: Error while executing DataSetLoadStrategy
at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:46)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:342)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:268)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:187)
... 21 more
Caused by: org.dbunit.dataset.NoSuchColumnException: client.ID - (Non-uppercase input column: ID) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.
at org.dbunit.dataset.AbstractTableMetaData.getColumnIndex(AbstractTableMetaData.java:117)
at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:89)
at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:143)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at org.unitils.dbunit.datasetloadstrategy.impl.CleanInsertLoadStrategy.doExecute(CleanInsertLoadStrategy.java:45)
at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:44)
... 24 more
Maybe there is some new variants or some thoughts about that issue?也许有一些新的变体或关于这个问题的一些想法? Thanks.
谢谢。
I would say that the problem is here: 我会说问题出在这里:
database.identifierQuoteString.mysql=none
Try setting it to the following instead: 尝试将其设置为以下内容:
database.identifierQuoteString.mysql=auto
Ultimately the class MySqlDbSupport has a bug in it. 最终,类MySqlDbSupport中有一个bug。 If the
database.identifierQuoteString.mysql
property is set to none
in the properties file, a private field named identifierQuoteString
in the class DbSupport is set to null. 如果在属性文件中将
database.identifierQuoteString.mysql
属性设置为none
,则将DbSupport类中名为identifierQuoteString
的私有字段设置为null。 The toCorrectCaseIdentifier
method in MySqlDbSupport fetches the value of this field, but forgets to do a null-check before passing it to String.startsWith
. toCorrectCaseIdentifier
中的toCorrectCaseIdentifier
方法获取此字段的值,但是在将其传递给String.startsWith
之前忘记进行空检查。 Hence we get a NullPointerException. 因此,我们得到一个NullPointerException。
Using auto
asks the database for the identifier-quote string to use. 使用
auto
向数据库询问要使用的标识符-引号字符串。 I don't see why you would want to use anything other than this. 我不明白为什么您会想要使用除此以外的任何东西。
I got the same issue when using unitils with a MySQL DB. 在MySQL数据库中使用unitils时,我遇到了同样的问题。 The solution is to configure a MySQL metadata handler :
解决方案是配置一个MySQL元数据处理程序:
org.dbunit.database.IMetadataHandler.implClassName=org.dbunit.ext.mysql.MySqlMetadataHandler
I know that issue is old and unitils is no longer maintained but it can help someone. 我知道这个问题已经很久了,Unitils不再得到维护,但可以帮助别人。
在我的情况下,解决方案是将此行添加到属性中:
unitils.module.dbunit.className=org.dbunit.MySqlDbUnitModule
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.