NoSuchTableException 使用 dbunit 测试 dao class
NoSuchTableException using dbunit to test dao class
我正在使用带有 h2 内存数据库的 dbunit 来测试我编写的 DAO class 中的方法。套件中的所有测试过去都成功通过,但后来我重新组织了项目的目录结构,现在当我 运行 测试套件时,我得到了一个 NoSuchTableException。我觉得这一定是某种构建路径错误,但我已经为此苦苦思索了两天,无法修复它。
以下是测试 class 的摘录,其中包含一些设置方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest(DAOUtilities.class)
public class FeedingScheduleDaoImplDBUnitTest extends DataSourceBasedDBTestCase {
private Connection connection;
private FeedingScheduleDaoImpl fsdi = new FeedingScheduleDaoImpl();
@Override
protected DataSource getDataSource() {
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setUrl("jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'");
dataSource.setUser("sa");
dataSource.setPassword("sa");
return dataSource;
}
@Override
protected IDataSet getDataSet() throws Exception {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data.xml");
return new FlatXmlDataSetBuilder().build(inputStream);
}
@Override
protected DatabaseOperation getSetUpOperation() {
return DatabaseOperation.REFRESH;
}
@Override
protected DatabaseOperation getTearDownOperation() {
return DatabaseOperation.DELETE_ALL;
}
@Before
public void setUp() throws Exception {
super.setUp();
connection = getConnection().getConnection();
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
public void givenDataSetEmptySchema_whenDataSetCreated_thenTablesAreEqual() throws Exception {
IDataSet expectedDataSet = getDataSet();
ITable expectedTable = expectedDataSet.getTable("animals");
IDataSet databaseDataSet = getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable("animals");
Assertion.assertEquals(expectedTable, actualTable);
}
}
实际上是 return new FlatXmlDataSetBuilder().build(inputStream);
产生了异常,但我怀疑这是因为架构没有在 getDataSource()
方法中正确加载。
下面是我整理后的新目录结构。测试需要的sql schema文件和xml数据文件都在src/test/resources目录下
eZoo directory structure
这是我的 pom.xml 的构建部分。我没有为构建指定任何源目录或资源目录,因此如果我理解正确,那应该将所有资源文件放置在默认的 target/test-classes 目录中。我查过了,他们确实在那里。
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
任何提示或帮助将不胜感激。我还在学习如何使用Maven,我做了这次重组是为了更好地理解标准的Maven项目结构,所以我希望既能修复我的问题,又能学习如何更好地使用Maven。
修修补补后,我找到了解决问题的办法。我从 xml 文件中删除了以下行:
<!DOCTYPE xml>
这是我找到解决方案的另一个问题和答案的link:。
我正在使用带有 h2 内存数据库的 dbunit 来测试我编写的 DAO class 中的方法。套件中的所有测试过去都成功通过,但后来我重新组织了项目的目录结构,现在当我 运行 测试套件时,我得到了一个 NoSuchTableException。我觉得这一定是某种构建路径错误,但我已经为此苦苦思索了两天,无法修复它。
以下是测试 class 的摘录,其中包含一些设置方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest(DAOUtilities.class)
public class FeedingScheduleDaoImplDBUnitTest extends DataSourceBasedDBTestCase {
private Connection connection;
private FeedingScheduleDaoImpl fsdi = new FeedingScheduleDaoImpl();
@Override
protected DataSource getDataSource() {
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setUrl("jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;init=runscript from 'classpath:schema.sql'");
dataSource.setUser("sa");
dataSource.setPassword("sa");
return dataSource;
}
@Override
protected IDataSet getDataSet() throws Exception {
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data.xml");
return new FlatXmlDataSetBuilder().build(inputStream);
}
@Override
protected DatabaseOperation getSetUpOperation() {
return DatabaseOperation.REFRESH;
}
@Override
protected DatabaseOperation getTearDownOperation() {
return DatabaseOperation.DELETE_ALL;
}
@Before
public void setUp() throws Exception {
super.setUp();
connection = getConnection().getConnection();
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
public void givenDataSetEmptySchema_whenDataSetCreated_thenTablesAreEqual() throws Exception {
IDataSet expectedDataSet = getDataSet();
ITable expectedTable = expectedDataSet.getTable("animals");
IDataSet databaseDataSet = getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable("animals");
Assertion.assertEquals(expectedTable, actualTable);
}
}
实际上是 return new FlatXmlDataSetBuilder().build(inputStream);
产生了异常,但我怀疑这是因为架构没有在 getDataSource()
方法中正确加载。
下面是我整理后的新目录结构。测试需要的sql schema文件和xml数据文件都在src/test/resources目录下
eZoo directory structure
这是我的 pom.xml 的构建部分。我没有为构建指定任何源目录或资源目录,因此如果我理解正确,那应该将所有资源文件放置在默认的 target/test-classes 目录中。我查过了,他们确实在那里。
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
任何提示或帮助将不胜感激。我还在学习如何使用Maven,我做了这次重组是为了更好地理解标准的Maven项目结构,所以我希望既能修复我的问题,又能学习如何更好地使用Maven。
修修补补后,我找到了解决问题的办法。我从 xml 文件中删除了以下行:
<!DOCTYPE xml>
这是我找到解决方案的另一个问题和答案的link:。