【问题标题】:org.dbunit.dataset.NoSuchTableException: UserTestorg.dbunit.dataset.NoSuchTableException:用户测试
【发布时间】:2017-04-11 10:13:45
【问题描述】:

我找到了一些如何使用dbunit here, from the junitbook2 example的例子

我已经尝试过并且它有效,所以我尝试在我的项目中使用它;我的项目是基于 maven 的,为了使用数据库,我使用了对外部 jar 的引用,该 jar 使用“ant run”创建了我的表的 bean。 因此,在我的 maven 项目中,我在 src/main/java + src/test/java 中的其他类中创建了 1 个接口(UserDao),就像书中的示例一样。

UserDao 接口:

import java.sql.SQLException;
import com.mydb.UserTest;
public interface UserDao {

  /**
   * Insert an user in the database.
   * 
   * @param user user to be inserted
   * @return if id the inserted user
   */
  long addUser( UserTest user ) throws SQLException;
  UserTest getUserById( long id ) throws SQLException;
}

AbstractDbUnitTestCase:

import static org.junit.Assert.*;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;

import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ReplacementDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.ext.hsqldb.HsqldbConnection;
import org.junit.AfterClass;
import org.junit.BeforeClass;

public abstract class AbstractDbUnitTestCase {

  protected static UserDaoJdbcImpl dao = new UserDaoJdbcImpl();
  protected static Connection connection;
  protected static HsqldbConnection dbunitConnection;

  @BeforeClass
  public static void setupDatabase() throws Exception {
    Class.forName("com.mysql.jdbc.Driver");
    connection = DriverManager.getConnection("jdbc:mysql://mydb/mydb","user","password");
    if (connection != null) 
        System.out.println("Connected to the database");
    dbunitConnection = new HsqldbConnection(connection,null);
    dao.setConnection(connection);
  }

  @AfterClass
  public static void closeDatabase() throws Exception {
    if ( dbunitConnection != null ) {
      dbunitConnection.close();
      dbunitConnection = null;
    }
  }

  public static IDataSet getDataSet(String name) throws Exception {
    InputStream inputStream = AbstractDbUnitTestCase.class.getResourceAsStream(name);
    assertNotNull("file " + name + " not found in classpath", inputStream );
    Reader reader = new InputStreamReader(inputStream);
    FlatXmlDataSet dataset = new FlatXmlDataSet(reader);
    return dataset;
  }

  public static IDataSet getReplacedDataSet(String name, long id) throws Exception {
    IDataSet originalDataSet = getDataSet(name);
    return getReplacedDataSet(originalDataSet, id);
  }

  public static IDataSet getReplacedDataSet(IDataSet originalDataSet, long id) throws Exception {
    ReplacementDataSet replacementDataSet = new ReplacementDataSet(originalDataSet);
    replacementDataSet.addReplacementObject("[ID]", id);
    replacementDataSet.addReplacementObject("[NULL]", null);
    return replacementDataSet;
  }

}

UserDaoJdbcImplTest --> 测试在哪里

import static org.junit.Assert.*;
import static com.test.EntitiesHelper.*;


import org.dbunit.Assertion;
import org.dbunit.dataset.IDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Ignore;
import org.junit.Test;

import com.mydb.UserTest;

public class UserDaoJdbcImplTest extends AbstractDbUnitTestCase {

  @Test
  public void testGetUserById() throws Exception {
    IDataSet setupDataSet = getDataSet("/user.xml");
    DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, setupDataSet);
    UserProvaTest user = dao.getUserById(1);
    assertNotNull( user);
    assertEquals( "Jeffrey", user.getFirstName() );
    assertEquals( "Lebowsky", user.getLastName() );
    assertEquals( "ElDuderino", user.getUsername() );
  }

  @Test @Ignore("fails if run together with others")
  public void testAddUser() throws Exception {
    UserProvaTest user = newUser();
    long id = dao.addUser(user);
    assertTrue(id>0);
    IDataSet expectedDataSet = getDataSet("/user.xml");
    IDataSet actualDataSet = dbunitConnection.createDataSet();
    Assertion.assertEquals( expectedDataSet, actualDataSet );
  }

  @Test
  public void testAddUseIgnoringId() throws Exception {
    IDataSet setupDataSet = getDataSet("/user.xml");
    DatabaseOperation.DELETE_ALL.execute(dbunitConnection, setupDataSet);
    UserProvaTest user = newUser();
    long id = dao.addUser(user);
    assertTrue(id>0);
    IDataSet expectedDataSet = getDataSet("/user.xml");
    IDataSet actualDataSet = dbunitConnection.createDataSet();
    Assertion.assertEqualsIgnoreCols( expectedDataSet, actualDataSet, "users", new String[] { "id" } );
  }

  @Test
  public void testGetUserByIdReplacingIds() throws Exception {
    long id = 42;
    IDataSet setupDataset = getReplacedDataSet("/user-token.xml", id );
    DatabaseOperation.INSERT.execute(dbunitConnection, setupDataset);
    UserProvaTest user = dao.getUserById(id);
    assertUser(user);
  }

  @Test
  public void testAddUserReplacingIds() throws Exception {
    IDataSet setupDataSet = getDataSet("/user-token.xml");
    DatabaseOperation.DELETE_ALL.execute(dbunitConnection, setupDataSet);
    UserProvaTest user = newUser();
    long id = dao.addUser(user);
    assertTrue(id>0);
    IDataSet expectedDataSet = getReplacedDataSet(setupDataSet, id );
    IDataSet actualDataSet = dbunitConnection.createDataSet();
    Assertion.assertEquals( expectedDataSet, actualDataSet );
  }

}

我的 Bean UserTest 就是这样创建的:

@Entity (name="mydb_UserTest")@Table(name="UserTest"
    ,catalog="mydb" )

还有 user.xml 文件:

<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <mydb_UserTest id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" />
</dataset>

但是当我尝试执行测试时,我遇到了这个错误:

testGetUserById(com.test.UserDaoJdbcImplTest) 经过时间:0.176 秒

我看到了:

  1. 与数据库的连接正确
  2. 但是不管我在user.xml文件中写了什么,例如 User1111Test而不是UserTest,错误是一样的(如org.dbunit.dataset.NoSuchTableException: User1111Test);我也尝试使用 schema.UserTest,建议 here 但错误是相同的 NoSuchTableException: schema.UserTest。
  3. 错误出现在这一点上:

    DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, 设置数据集);

我做错了什么?

【问题讨论】:

    标签: java maven junit dbunit


    【解决方案1】:

    你必须添加FEATURE_QUALIFIED_TABLE_NAMES属性:

    DatabaseConfig config = dBConn.getConfig();
    config.setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true);
    

    把它放在你的 setupDatabase 方法中。

    在您的 dataset 中,您必须添加架构名称:

    <?xml version='1.0' encoding='UTF-8'?>
    <dataset>
     <SCHEMA.USERTEST ID="1" USERNAME="ELDUDERINO" FIRST_NAME="JEFFREY" LAST_NAME="LEBOWSKY" />
    </dataset>
    

    注意大写的数据集。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答,我的项目中没有setUpDatabaseConfig方法,您的意思是我的AbstractDbUnitTestCase中的setupDatabase吗?你可以说得更详细点吗?而我的表名是UserTest,大写有没有问题?谢谢
    • 我已经编辑了答案。我的表名是小写的,我也遇到了以小写指定数据集的问题。
    • 我已经用你的代码改变了我的代码,我把你建议的代码放在我的 setupDatabase() 方法的末尾,现在在通常的错误之前出现了这个错误:10 [main] INFO org.dbunit .database.DatabaseConfig - 未知属性“dbunit.org/features/qualifiedTableNames”。无法验证要设置的对象的类型。请通知开发商更新属性列表。 org.dbunit.dataset.NoSuchTableException:SCHEMA.USERTEST
    • 对不起,我没有写我的 bean 是以这种方式创建的:@Entity (name="mydb_UserTest")@Table(name="UserTest" ,catalog="mydb" ) 所以我使用数据集中的 MYDB_USERTEST
    【解决方案2】:

    基于此信息:

    @Entity (name="mydb_UserTest")@Table(name="UserTest"
        ,catalog="mydb" )
    

    正确的 dbUnit 文件表名是:

    <?xml version='1.0' encoding='UTF-8'?>
    <dataset>
      <mydb.UserTest id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" />
    </dataset>
    

    如果它是数据库用户的默认架构(通常在架构名称与用户名匹配时),则不带架构名称:

    <?xml version='1.0' encoding='UTF-8'?>
    <dataset>
      <UserTest id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" />
    </dataset>
    

    【讨论】:

      【解决方案3】:

      终于,我得到了解决方案……

      我将 DB 中的表名从 UserTest 更改为 USERTEST,并使用此 user.xml

      <?xml version='1.0' encoding='UTF-8'?>
      <dataset>
        <USERTEST id="1" username="ElDuderino" first_name="Jeffrey" last_name="Lebowsky" />
      </dataset>
      

      我认为,就我而言,没有其他选择,因为这两个属性:

      config.setProperty(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true);
      config.setProperty(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, true);
      

      返回此信息,因此它们不起作用:

      [main] INFO org.dbunit.database.DatabaseConfig - Unknown property 'http://www.dbunit.org/features/qualifiedTableNames'. Cannot validate the type of the object to be set. Please notify a developer to update the list of properties.  
      [main] INFO org.dbunit.database.DatabaseConfig - Unknown property 'http://www.dbunit.org/features/caseSensitiveTableNames'. Cannot validate the type of the object to be set. Please notify a developer to update the list of properties.
      

      更新: 避免FEATURE_QUALIFIED_TABLE_NAMES 的信息/错误的解决方案是使用

      dbunitConnection.getConfig().setFeature(DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true); dbunitConnection.getConfig().setFeature(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, true);

      而不是setProperty;并将HsqldbConnection dbunitConnection 更改为MySqlConnection dbunitConnection

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-17
        • 1970-01-01
        • 2011-11-23
        • 2016-08-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多