【发布时间】: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 秒
我看到了:
- 与数据库的连接正确
- 但是不管我在user.xml文件中写了什么,例如 User1111Test而不是UserTest,错误是一样的(如org.dbunit.dataset.NoSuchTableException: User1111Test);我也尝试使用 schema.UserTest,建议 here 但错误是相同的 NoSuchTableException: schema.UserTest。
- 错误出现在这一点上:
DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, 设置数据集);
我做错了什么?
【问题讨论】: