3

我尝试使用 flatXmlDataSetBuilder 为我的 junit 测试填充数据库 MS-SQLSERVER。问题是表名包含“-”。

我正在使用的 xml 如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <TABLE-NAME ID="1111" NAME="TEST"/>
</dataset>

代码是:

FlatXmlDataSetBuilder flatXmlDataSetBuilder = new FlatXmlDataSetBuilder();
            flatXmlDataSetBuilder.setColumnSensing(true);
            dataset = flatXmlDataSetBuilder.build(Thread.currentThread()
                    .getContextClassLoader()
                    .getResourceAsStream("populate.xml"));

我得到“com.microsoft.sqlserver.jdbc.SQLServerException:'-'附近的语法不正确”的错误。

我知道我必须用 [TABLE-NAME] 这样的括号括起来,但在这种情况下,我会从 xml 中得到一个错误:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <[TABLE-NAME] ID="1111" NAME="TEST"/>
</dataset>

org.dbunit.dataset.DataSetException:第 3 行:元素的内容必须由格式良好的字符数据或标记组成。

知道如何解决吗?

谢谢

4

1 回答 1

2

或者,您可以使用 XmlDataSet 代替 FlatXmlDataSet 来避免“-”字符的问题。您可以在下面看到一个 dbunit 完整示例:

package yourPackage;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
import org.dbunit.dataset.xml.XmlDataSet;
import org.junit.Test;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;

public class TestDBUnitDummy extends DBTestCase
{

    public TestDBUnitDummy( String name ) throws Exception
    {
        super( name );
        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "com.microsoft.sqlserver.jdbc.SQLServerDriver" );
        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "jdbc:sqlserver://MyServer;databaseName=MyDatabase" );
        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "sa" );
        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "" );
    }

    public static void Export() throws Exception
    {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        Connection jdbcConnection = DriverManager.getConnection("jdbc:sqlserver://MySourceServer;databaseName=MyDatabase", "sa", "");
        IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);

        QueryDataSet partialDataSet = new QueryDataSet(connection);
        partialDataSet.addTable("TABLE-NAME", "SELECT * FROM [TABLE-NAME]");
        XmlDataSet.write(partialDataSet, new FileOutputStream("table.xml"));
        FlatXmlDataSet.write(partialDataSet, new FileOutputStream("table_flat.xml"));
    }

    protected void setUpDatabaseConfig( DatabaseConfig config )
    {
    config.setProperty(DatabaseConfig.PROPERTY_ESCAPE_PATTERN , "[?]");
    }

    protected IDataSet getDataSet() throws Exception
    {
        Export();
        return new XmlDataSet( new FileInputStream( "table.xml" ) );
    }


    @Test
    public void test_001()
    {
        assertEquals( "Dummy test", true, true );       
    }

}

[TABLE-NAME] 是使用 SQL 使用以下命令创建的:

CREATE TABLE [TABLE-NAME](
    [ID] [int] NULL,
    [DESCRIPTION] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT INTO [TABLE-NAME] VALUES (1,'ONE')
INSERT INTO [TABLE-NAME] VALUES (2,'TWO')
INSERT INTO [TABLE-NAME] VALUES (3,'THREE')
GO

XmlDataSet 看起来像这样:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <table name="TABLE-NAME">
    <column>ID</column>
    <column>DESCRIPTION</column>
    <row>
     <value>1</value>
     <value>ONE</value>
    </row>
    <row>
     <value>2</value>
     <value>TWO</value>
    </row>
    <row>
     <value>3</value>
     <value>THREE</value>
    </row>
  </table>
</dataset>

FlatXmlDataSet 看起来像这样:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <[TABLE-NAME] ID="1" DESCRIPTION="ONE"/>
  <[TABLE-NAME] ID="2" DESCRIPTION="TWO"/>
  <[TABLE-NAME] ID="3" DESCRIPTION="THREE"/>
</dataset>

由于“-”字符,此 xml 文件格式不正确。

于 2017-10-18T15:13:17.617 回答