- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定我的 DAO 或 DBUnit 测试是否需要一些重构。有人可以指导我面临的情况吗?
我有一个 DAO,它通过获取 Connection
对象从数据库获取一些数据,然后关闭所有资源(ResultSet
、Statement
和连接
)。
我正在使用 DBUnit 框架测试这个 DAO,在这里我在此 DBUnit 测试中执行两个数据库操作:1)创建表,然后从XML数据集文件加载数据2) 测试 DAO 中存在的实际 getDataById(int id)
方法
问题是我的第二个 getDataById(id)
方法无法获取数据库连接对象,因为我的 DAO 在执行上述步骤 1 时已将其关闭。
实际释放所有资源的代码片段如下所示。
DAO.java(代码片段)
public void releaseResources(ResultSet rs, Statement stmt, Connection cn) {
System.out.println("rs = " + rs);
System.out.println("stmt = " + stmt);
System.out.println("cn = " + cn);
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (cn != null) {
cn.close();
}
} catch (SQLException ex) {
System.out.println("Exception while closing DB resources rs, stmt or cn......." + ex);
}
}
因此,为了让我的 DBUnit 测试正常工作,我必须重载上述 releaseResources() 方法,以便它不会关闭可在我的 getDataById(int id)
中使用的连接对象单元测试。如下所示。
**DAO.java(具有重载方法的代码片段)**
//OVERLOADED JUST TO GET DBUNIT TESTS WORKING !!! :(
public void releaseResources(Statement stmt) {
System.out.println("\nReleasing db resources now.... 1111");
System.out.println("stmt = " + stmt);
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException ex) {
System.out.println("Exception while closing DB resources stmt......." + ex);
}
}
我不确定这是否是正确的设计。有人可以指导我如何改进吗?
完整代码如下所示,供进一步引用。
StateDaoTest.java
public class StateDaoTest {
protected static Connection connection;
protected static HsqldbConnection dbunitConnection;
protected static StateDao dao = new StateDao();
@BeforeClass
public static void setupDatabase() throws Exception {
Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:mem:my-project-test;shutdown=true");
dbunitConnection = new HsqldbConnection(connection, null);
}
@Before
public void createTable() throws SQLException {
dao.setConnection(connection);
dao.createTables();
}
protected IDataSet getDataSet(String name) throws Exception {
InputStream inputStream = getClass().getResourceAsStream(name);
assertNotNull("file" + name + " not found in classpath", inputStream);
Reader reader = new InputStreamReader(inputStream);
FlatXmlDataSet dataset = new FlatXmlDataSet(reader);
return dataset;
}
@AfterClass
public static void closeDatabase() throws Exception {
System.out.println("\ninto the closeDatabase() method...");
System.out.println("connection = " + connection);
System.out.println("dbunitConnection = " + dbunitConnection);
if (connection != null) {
connection.close();
connection = null;
}
if (dbunitConnection != null) {
dbunitConnection.close();
dbunitConnection = null;
}
}
@Test
public void testGetStateById() throws Exception {
IDataSet setupDataSet = getDataSet("/states.xml");
DatabaseOperation.CLEAN_INSERT.execute(dbunitConnection, setupDataSet);
State state = dao.getStateById(1);
assertNotNull(state);
assertEquals("Pennsylvania", state.getName());
assertEquals("PA", state.getStateCode());
assertNotNull(state.getTaxPct());
assertEquals("Y", state.getActive());
}
}
StateDao.java
public class StateDao {
private Connection connection;
public void setConnection(Connection connection) {
this.connection = connection;
}
//added for dbunit tests
public void createTables() throws SQLException {
String sql = "CREATE TABLE states (stateId INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1), "
+ "stateCd VARCHAR(10), name VARCHAR(20), taxPct NUMERIC, active CHAR(1))";
Statement stmt = null;
try {
stmt = connection.createStatement();
stmt.execute(sql);
} finally {
releaseResources(stmt);
}
}
public State getStateById(long id) {
String sql = "SELECT * FROM states WHERE stateId = " + id;
Statement stmt = null;
ResultSet rs = null;
State state = null;
System.out.println(sql);
try {
stmt = connection.createStatement();
rs = stmt.executeQuery(sql);
while (rs != null && rs.next()) {
String stateId = StringUtils.defaultString(rs.getString("stateId"));
String stateCd = StringUtils.defaultString(rs.getString("stateCd"));
String name = StringUtils.defaultString(rs.getString("name"));
String taxPct = StringUtils.defaultIfEmpty(rs.getString("taxPct"), "0");
String active = StringUtils.defaultString(rs.getString("active"));
state = new State(new Integer(stateId), stateCd, name, new BigDecimal(taxPct), active);
System.out.println("state = " + state);
}
System.out.println("state = " + state);
} catch (SQLException ex) {
System.out.println("Exception whiile fetching data for a state......." + ex);
} finally {
releaseResources(rs, stmt, connection);
}
return state;
}
public void releaseResources(ResultSet rs, Statement stmt, Connection cn) {
System.out.println("\nReleasing db resources now....2222");
System.out.println("rs = " + rs);
System.out.println("stmt = " + stmt);
System.out.println("cn = " + cn);
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (cn != null) {
cn.close();
}
} catch (SQLException ex) {
System.out.println("Exception while closing DB resources rs, stmt or cn......." + ex);
}
}
//added for dbunit tests
public void releaseResources(Statement stmt) {
System.out.println("\nReleasing db resources now.... 1111");
System.out.println("stmt = " + stmt);
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException ex) {
System.out.println("Exception while closing DB resources stmt......." + ex);
}
}
}
最佳答案
我会继续使用重载的releaseResources
方法。如果连接是从外部传入的,那么 dao 不拥有它,也不应该关闭它。相反,连接应该由创建它的同一个类单独关闭。所以getStateById
应该改为只关闭resultSet和statement,其他地方应该关闭连接。
您可以添加额外的 releaseResources
重载来获取 resultSet 和语句,或者如果您使用的是 Java 7 - 您可以创建一个方法:releaseResouces(Closeable... closeables)
。我会将这个方法作为一个单独类的公共(public)静态方法,以便任何类都可以使用它。
关于java - DAO 设计模式与 DBUnit 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954583/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!