org.dbunit.dataset.NoSuchTableException:UserTest

问题描述 投票:0回答:3

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

我已经尝试过它有效,所以我尝试在我的项目中使用它;我的项目是基于maven的,并且为了使用数据库,我使用对外部jar的引用来创建带有“ant run”的表的bean。所以在我的maven项目中,我在我的src / main / java + src / test / java中的其他类中创建了1个Interface(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 );
  }

}

My 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秒<<<错误! org.dbunit.dataset.NoSuchTableException:UserTest

我看到了:

  1. 与数据库的连接是正确的
  2. 但无论我写入user.xml文件,例如User1111Test而不是UserTest,错误都是一样的(如org.dbunit.dataset.NoSuchTableException:User1111Test);我也尝试使用schema.UserTest,这是建议here但错误是相同的NoSuchTableException:schema.UserTest。
  3. 错误就在这一点上: DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection,setupDataSet);

我做错了什么?

java maven junit dbunit
3个回答
0
投票

你必须添加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>

请注意大写的数据集。

希望这可以帮助。


0
投票

基于此信息:

@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>

0
投票

最后,我得到了解决方案......

我将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>

我认为,在我的情况下,没有替代品,因为2个属性:

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

© www.soinside.com 2019 - 2024. All rights reserved.