我的测试出现以下错误
org.dbunit.dataset.NoSuchColumnException: NEWS.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:128)
at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:89)
at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:140)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:155)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:77)
at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:134)
at junit.framework.TestCase.runBare(TestCase.java:132)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
以下是我的准备数据
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <news id="4028bcf0230877e40123087951b80001" type="平台新闻" title="yt" author="ghj" source="yfgjh" keyword="fd" compositionDate="2009-08-05" publishDate="2009-08-27" readCount="657" attachmentName="1.JPG" attachmentContent="" status="未发布"/>
</dataset>以下是我的ddl表
-- Table "news" DDLCREATE TABLE `news` (
  `id` varchar(32) NOT NULL,
  `type` varchar(50) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `author` varchar(50) DEFAULT NULL,
  `source` varchar(50) DEFAULT NULL,
  `keyword` varchar(50) DEFAULT NULL,
  `compositionDate` date DEFAULT NULL,
  `publishDate` date DEFAULT NULL,
  `readCount` int(11) DEFAULT NULL,
  `attachmentName` varchar(50) DEFAULT NULL,
  `attachmentContent` longblob,
  `content` mediumtext,
  `status` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
以下是我的程序代码package org.ch.db;import java.io.File;import javax.sql.DataSource;import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.dbunit.DataSourceBasedDBTestCase;
import org.dbunit.IDatabaseTester;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.ext.mysql.MySqlConnection;
import org.dbunit.operation.DatabaseOperation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/**
 * Dao单元测试基类
 * 
 * @version 2009-6-5
 * @author Rongjun Wang
 * @since 1.1
 */
public abstract class AbstractDaoUnitTestCase extends DataSourceBasedDBTestCase {
protected Logger log = LogManager.getLogger(this.getClass().getName()); private static String testXMLResPath = "src/test/org/ch/db/data/";
private static ApplicationContext ctx;
private static DataSource dataSource;
// private static String driverName = "com.mysql.jdbc.Driver";  
// private static String dburl = "jdbc:mysql://192.168.60.123/itil-test";  
// private static String username = "ITIL-TEST";  
// private static String pwd = "111111"; public AbstractDaoUnitTestCase() {
initialize();
}

private static void initialize() {
//ctx只在第一次实例化的时候创建
if (ctx == null) {
String[] paths = {"classpath:datasource/test-applicationContext.xml",
"classpath:datasource/test-datasource-mysql.xml",
"classpath:dao/test-news-hibernate-dao.xml"
};

ctx = new ClassPathXmlApplicationContext(paths);
}

if (dataSource == null) {
dataSource = (DataSource) ctx.getBean("dataSource");
}
} @Override
protected IDatabaseConnection getConnection() throws Exception {
IDatabaseTester dbTester = newDatabaseTester();
IDatabaseConnection con = dbTester.getConnection();
IDatabaseConnection connection  = new MySqlConnection(con.getConnection(), null);

// Class.forName(driverName); 
// Connection con = DriverManager.getConnection(dburl, username, pwd);  
// IDatabaseConnection connection  = new MySqlConnection(con, null);
return connection;
}

/**
 * 通过文件名,得到FlatXmlDataSet实例
 * 
 * @param filename 准备数据xml文件名
 * @return
 * @throws Exception
 */
public IDataSet getDataSet(String filename)  throws Exception {
return new FlatXmlDataSet(new File(testXMLResPath + filename), false);
}

@Override
    protected DatabaseOperation getTearDownOperation() throws Exception {
        return DatabaseOperation.DELETE_ALL;
    }

public String getTestXMLResPath() {
return testXMLResPath;
} public ApplicationContext getCtx() {
return ctx;
} @Override
public DataSource getDataSource() {
return dataSource;
} public void setTestXMLResPath(String xmlPath) {
testXMLResPath = xmlPath;
} public void setDataSource(DataSource dataSource) {
AbstractDaoUnitTestCase.dataSource = dataSource;
}

public ITable getTable(String tableName, String condition) throws Exception {
String sql = null;

if (condition != null && condition.length() > 0) {
sql = "select * from " + tableName + " " + condition;
}

QueryDataSet actualDataSet = new QueryDataSet(getConnection());
actualDataSet.addTable(tableName, sql); 

return actualDataSet.getTable(tableName);
}

public ITable getTableBySQL(String tableName, String sql) throws Exception {
QueryDataSet actualDataSet = new QueryDataSet(getConnection());
actualDataSet.addTable(tableName, sql); 

return actualDataSet.getTable(tableName);
}
}
package org.ch.db.dao;import ch.dao.hibernateImpl.news.DateUtil;
import org.ch.db.AbstractDaoUnitTestCase;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.junit.Assert;import ch.dao.inf.news.ChINewsDao;
import ch.entity.News;public class TestNews extends AbstractDaoUnitTestCase {

private IDataSet xmlDataSet;
private ChINewsDao newsDao;
private String tableName = "news";
private ITable newsTable = null;

@Override
protected IDataSet getDataSet() throws Exception {
xmlDataSet = this.getDataSet("news.xml");
newsTable = xmlDataSet.getTable(tableName);
return xmlDataSet; 
}

public TestNews() {
this.newsDao = (ChINewsDao) getCtx().getBean("newsDao");
}

//~test method ==============================================
public void testInsertNews() throws Exception {

News news = new News();
String newsId = (String) newsTable.getValue(0, "id");

news.setPublishDate(DateUtil.getCurrentDateTime());
news.setType("平台新闻");
news.setTitle("wet");
news.setId(newsId);

//operation
boolean success = newsDao.insertNews(news);

//assert
Assert.assertTrue(success);
Assert.assertNotNull(news.getId());

}}请问大家我应该修改哪里?

解决方案 »

  1.   

    你用的是什么数据库?oracle吗? 看你的错误好像是你连接的数据库无法创建id这种类型。 id自动增长吗?
      

  2.   

    我用的是mysql,id不是自动增长的
      

  3.   

    (Non-uppercase input column: id)
    不是大小写的问题吗? id改成大写试试。
      

  4.   

    这个问题我在用dbunit + unitils 做单元测试的时候也正好碰到过!这个问题貌似是个BUG,但是可以通过修改源代码解决!修改DBUNIT的源代码:“DefaultMetadataHandler.java”文件找到这句代码“areEqualIgnoreNull(schema, schemaName, caseSensitive) &&”然后把它删掉!最后it's work!
      

  5.   

    iDbConnection = new DatabaseConnection(con, dbUser);
    iDbConnection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory());