在我调整架构时,在我看来,在多个小数据集中传播测试数据会产生维护问题.有人看到创建一个更大的测试数据集的问题?通过"更大",我仍然只谈论几百条记录.
尝试在内存 DB2 数据库上运行插入语句时,DBUnit 抛出异常:
org.dbunit.dataset.DataSetException: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "HOUR" at line 1, column 45.
Run Code Online (Sandbox Code Playgroud)
我意识到“HOUR”是 DB2 中的保留关键字,但我不确定如何让 dbunit 转义这个保留关键字。
有没有人知道dbunit是否有能力根据sql语句一次从多个表中导出特定数据,这可以通过使用dbunit的QueryDataSet类基于sql语句从单个表中导出数据来实现,如此处所示.
詹姆士
我正在修复我们的项目的测试套件,正在通过Hibernate/DBUnit进行测试.有几个测试用例都会从Hibernate中抛出类似的异常,看起来像这样:
java.sql.SQLException:不在聚合函数或group by子句中:org.hsqldb.Expression @ 109062e在语句[... blah ...]中
通过我的谷歌搜索,我怀疑这是由我们使用聚合函数AVG()引起的,因为这是在异常的消息中,并且所有抛出的查询都包含它.但是,我发现了几个链接,这些链接指向获得此错误的人,并且能够通过注释掉"ORDER BY"或"GROUP BY"子句,或者通过在分组中包含SELECT子句中的其他列来修复它.我明白为什么这会修复这样的错误信息,但我不确定它是否适用于我的情况,因为我尝试做同样的事情并没有任何区别.此外,我们有一些测试用例抛出使用ORDER/GROUP的异常,但不是全部.例如:
ThingerVO myThinger = (ThingerVO)session.createQuery("SELECT new ThingerVO(" +
"r.id, " + "u.id, " + "u.alias, " + "s.id, " +
"s.name, " + "r.URL," + "AVG(v.rating), " +
"r.totalCount, " + "r.isPrivate, " + "a.id, " +
"a.name, " + "r.transactionId, " + "r.size, " +
"u.hasPicture " +
") FROM Thinger r LEFT OUTER JOIN r.votes as v, Table1S s " +
"JOIN s.Table2A AS a, User u " + …Run Code Online (Sandbox Code Playgroud) 我在同一个地方不断收到 DBUnit 的异常:
org.dbunit.dataset.DataSetException: com.microsoft.sqlserver.jdbc.SQLServerException: Socket closed
at org.dbunit.database.DatabaseTableMetaData.getColumns(DatabaseTableMetaData.java:359)
Run Code Online (Sandbox Code Playgroud)
ETC。
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Socket closed
at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSChannel.read(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQueryInternal(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetFromStoredProc(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSetWithProvidedColumnNames(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getColumns(Unknown Source)
at org.dbunit.database.DefaultMetadataHandler.getColumns(DefaultMetadataHandler.java:52)
at org.dbunit.database.DatabaseTableMetaData.getColumns(DatabaseTableMetaData.java:315)
... 15 more
Run Code Online (Sandbox Code Playgroud)
当尝试从表中读取列元数据时会发生这种情况。执行此操作的代码如下所示:
new DefaultTable(tableName,
Columns.getColumns(columns,
connection.createDataSet(new String[]{tableName})
.getTableMetaData(tableName).getColumns()
)
)
Run Code Online (Sandbox Code Playgroud)
连接是 MsSqlConnection 实例。起初我以为这是一个网络问题,但这个理论有两个问题。首先运行测试的服务器和数据库都是同一个xen服务器上的虚拟机,所以没有真实的网络。其次,虽然问题不一致,但每次都发生在同一个地方。有超过 100 …
我一直在享受Hibernate的"yes_no"符号.我在活动字段上使用它很多,如下所示:
@Column(name = "active")
@Type(type = "true_false")
public boolean getActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
Run Code Online (Sandbox Code Playgroud)
最近我向一个不同的对象添加了一个名为可处理的新字段,如下所示:
@Column(name = "processable")
@Type(type = "true_false")
public void setProcessable(boolean processable) {
this.processable = processable;
}
public boolean getProcessable() {
return processable;
}
Run Code Online (Sandbox Code Playgroud)
当我编译和hibernate在MySQL中构建我的数据库时,active仍显示为char但可处理的是int.我错过了什么?我对允许的布尔数量有多少限制?
我有以下java代码,它给出了以下错误:
import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
public class export {
public static void main(String[] args) throws Exception {
// database connection
Class.forName("net.sourceforge.jtds.jdbc.Driver");
Connection jdbcConnection = DriverManager.getConnection(
"jdbc:jtds:sqlserver://localhost:1433/exampleDB", "sa", "vista1");
IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
// full database export
IDataSet fullDataSet = connection.createDataSet();
FlatXmlDataSet.write(fullDataSet, new FileOutputStream("full.xml"));
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
$ java导出
Exception in thread "main" java.lang.NoClassDefFoundError: org/dbunit/database/IDatabaseConnection
Caused by: java.lang.ClassNotFoundException: org.dbunit.database.IDatabaseConnection
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at …Run Code Online (Sandbox Code Playgroud) 大家好我正在使用dbunit.我正在尝试将db的datset导出到xml文件中.
import java.sql.Connection;
import java.sql.DriverManager;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import java.io.FileOutputStream;
public class DatabaseExport
{
public static void main(String[] args) throws Exception
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
Connection jdbcConnection = DriverManager.getConnection("jdbc:sqlserver://172.26.37.113:1433;DatabaseName=def_config","sqladmin_","halloween$2004");
IDatabaseConnection connection = new DatabaseConnection( jdbcConnection );
// full database export
IDataSet fullDataSet = connection.createDataSet();
FlatXmlDataSet.write(fullDataSet, new FileOutputStream("full.xml"));
}
}
Run Code Online (Sandbox Code Playgroud)
但它给出了这样的错误:
Exception in thread "main" org.dbunit.dataset.DataSetException: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'user'.
at org.dbunit.database.DatabaseDataSet.getTable(DatabaseDataSet.java:323)
at org.dbunit.database.DatabaseTableIterator.getTable(DatabaseTableIterator.java:89)
at org.dbunit.dataset.stream.DataSetProducerAdapter.produce(DataSetProducerAdapter.java:83)
at org.dbunit.dataset.xml.FlatXmlWriter.write(FlatXmlWriter.java:124)
at org.dbunit.dataset.xml.FlatXmlDataSet.write(FlatXmlDataSet.java:378)
at DatabaseExport.main(DatabaseExport.java:23)
Caused …Run Code Online (Sandbox Code Playgroud) 我正在尝试为在遗留数据库之上构建的 JPA 模型编写一些单元测试。我的模型中的一些对象图很大,我想找到一种编写单元测试的方法,以便我可以测试图中的单个对象(即实例化新对象、填充数据、持久化、刷新、比较刷新)对象成员与原始)隔离,而不必完全填充对象图。
我最初的想法是,我可以对被测对象中的任何引用对象使用模拟对象,但我认为这还不够,因为模式的引用完整性不允许模拟对象表示的对象无需填充数据即可插入。
我想我真正想要的是一种实例化被测试对象的方法,然后用我并不真正关心的数据填充对象图的其余部分,但仍然保持模式的引用完整性。
我知道 Java 单元测试有很多选择,包括 DbUnit、EasyMock、Unitils 等,但我不确定应该使用什么组合(或功能)来解决这个问题。有人能指出我正确的方向吗?也请随意批评我解决问题的方法;我可能需要重组它。