Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
Articles
Articles_cn
Articles_pt
Articles_zh
CreateManager_zh
LeftMenu
SandBox




JSPWiki v2.2.33

[RSS]


Hide Menu

CreateDAO_zh


Difference between version 13 and version 12:

At line 210 added 113 lines.
以上是我们使用JUnit测试而初始化和销毁PersonDao的基本代码,对象“ctx”引用了Spring的ApplicationContext,它在[BaseDaoTestCase|http://raibledesigns.com/downloads/appfuse/api/org/appfuse/dao/BaseDaoTestCase.java.html]类的静态代码区里被初始化。
现在我们需要实际测试DAO中的CRUD(create, retrieve, update, delete)方法,为此我们需要为每个方法建立以test(全部小写)开头的测试方法,只要这个方法是公共的,返回类型是void,它们就会被我们build.xml中的Ant的<junit>任务<junit>调用,如下是一些简单的CRUD测试,需要注意的一点是所有的方法(或者叫做测试)必须是自治的,添加如下代码到文件{{PersonDaoTest.java}}:
[{Java2HtmlPlugin
public void testGetPerson() throws Exception {
person = new Person();
person.setFirstName("Matt");
person.setLastName("Raible");
dao.savePerson(person);
assertNotNull(person.getId());
person = dao.getPerson(person.getId());
assertEquals(person.getFirstName(), "Matt");
}
public void testSavePerson() throws Exception {
person = dao.getPerson(new Long(1));
person.setFirstName("Matt");
person.setLastName("Last Name Updated");
dao.savePerson(person);
if (log.isDebugEnabled()) {
log.debug("updated Person: " + person);
}
assertEquals(person.getLastName(), "Last Name Updated");
}
public void testAddAndRemovePerson() throws Exception {
person = new Person();
person.setFirstName("Bill");
person.setLastName("Joy");
dao.savePerson(person);
assertEquals(person.getFirstName(), "Bill");
assertNotNull(person.getId());
if (log.isDebugEnabled()) {
log.debug("removing person...");
}
dao.removePerson(person.getId());
try {
person = dao.getPerson(person.getId());
fail("Person found in database");
} catch (DataAccessException dae) {
log.debug("Expected exception: " + dae.getMessage());
assertNotNull(dae);
}
}
}]
;:%%(color: blue)''在testGetPerson方法,我们创建了一个person并且调用get方法,我通常会增加一条我所需要的记录到数据库,因为在测试运行之前[DBUnit|http://www.dbunit.org]会为数据库准备测试数据,我们可以简单的在metadata/sql/sample-data.xml里添加测试所必须的记录''%%
<div style="color: blue !important; margin-left: 50px">
{{{
<table name='person'>
<column>id</column>
<column>first_name</column>
<column>last_name</column>
<row>
<value>1</value>
<value>Matt</value>
<value>Raible</value>
</row>
</table>
}}}
</div>
;:%%(color: blue)''&#36890;&#36807;&#36825;&#31181;&#26041;&#24335;&#20320;&#21487;&#20197;&#22312;testGetPerson&#26041;&#27861;&#37324;&#28040;&#38500;&#21019;&#24314;&#26032;&#32426;&#24405;&#30340;&#21160;&#20316;&#65292;&#22914;&#26524;&#20320;&#24895;&#24847;&#30452;&#25509;&#25554;&#20837;&#35760;&#24405;&#21040;&#25968;&#25454;&#24211;&#65288;&#20351;&#29992;SQL&#25110;&#32773;GUI&#65289;&#65292;&#20320;&#21487;&#20197;&#29992;__ant db-export__&#21644;__cp {{db-export.xml metadata/sql/sample-data.xml}}__&#37325;&#26032;&#26500;&#24314;&#20320;&#30340;{{sample-data.xml}}&#25991;&#20214;&#12290;''%%
&#22312;&#19978;&#38754;&#30340;&#20363;&#23376;&#37324;&#65292;&#20320;&#21487;&#20197;&#30475;&#21040;&#25105;&#20204;&#35843;&#29992;person.set*(value)&#26469;&#20934;&#22791;&#25105;&#20204;&#38656;&#35201;&#20445;&#23384;&#30340;&#23545;&#35937;&#65292;&#22312;&#36825;&#20010;&#20363;&#23376;&#37324;&#24456;&#31616;&#21333;&#65292;&#20294;&#26159;&#24403;&#20320;&#35201;&#25554;&#20837;10&#26465;&#24517;&#28155;&#23383;&#27573;(not-null="true")&#26102;&#23601;&#27604;&#36739;&#40635;&#28902;&#20102;&#65292;&#36825;&#23601;&#26159;&#25105;&#20026;&#20160;&#20040;&#35201;&#22312;BaseDaoTestCase&#20351;&#29992;ResourceBundle&#25991;&#20214;&#65292;&#21482;&#35201;&#22312;{{PersonDaoTest.java}}&#21516;&#19968;&#20010;&#30446;&#24405;&#21019;&#24314;&#19968;&#20010;{{PersonDaoTest.properties}}&#24182;&#19988;&#22312;&#37324;&#38754;&#23450;&#20041;&#20320;&#30340;&#23646;&#24615;&#20540;&#65306;
;:%%(color: blue)''&#25105;&#36890;&#24120;&#21482;&#26159;&#22312;Java&#37324;&#30828;&#32534;&#30721;&#65292;&#20294;&#26159;&#36825;&#20010;.properties&#23545;&#20110;&#22823;&#23545;&#35937;&#24456;&#26377;&#29992;&#12290;''%%
{{{
firstName=Matt
lastName=Raible
}}}
&#27492;&#26102;&#65292;&#20320;&#35201;&#36890;&#36807;&#35843;&#29992;BaseDaoTestCase.populate(java.lang.Object)&#26041;&#27861;&#26469;&#20934;&#22791;&#23545;&#35937;&#65292;&#32780;&#19981;&#26159;&#20351;&#29992;person.set*&#12290;
[{Java2HtmlPlugin
person = new Person();
person = (Person) populate(person);
}]
&#22312;&#30446;&#21069;&#24773;&#20917;&#19979;&#65292;&#36824;&#19981;&#21487;&#20197;&#32534;&#35793;PersonDaoTest&#65292;&#22240;&#20026;&#22312;&#31867;&#36335;&#24452;&#37324;&#36824;&#27809;&#26377;PersonDao.class&#65292;&#25105;&#20204;&#38656;&#35201;&#21019;&#24314;&#23427;&#12290;PersonDAO.java&#26159;&#19968;&#20010;&#25509;&#21475;&#65292;PersonDAOHibernate.java&#26159;&#23427;&#30340;Hibernate&#23454;&#29616;&#65292;&#35753;&#25105;&#20204;&#32487;&#32493;&#65292;&#24320;&#22987;&#21019;&#24314;&#12290;
!!&#21019;&#24314;&#19968;&#20010;&#23545;&#23545;&#35937;&#25191;&#34892;CRUD&#25805;&#20316;&#30340;&#26032;DAO[#4]
&#39532;&#19978;&#65292;&#22312;{{src/dao/**/dao}}&#30446;&#24405;&#37324;&#24314;&#31435;PersonDao.java&#25509;&#21475;&#65292;&#24182;&#19988;&#25351;&#23450;&#25152;&#26377;&#23454;&#29616;&#31867;&#35201;&#23454;&#29616;&#30340;&#22522;&#26412;CRUD&#25805;&#20316;&#65292;&#20026;&#20102;&#26174;&#31034;&#26041;&#20415;&#65292;&#25105;&#24050;&#32463;&#21435;&#25481;&#20102;&#25152;&#26377;JavaDocs&#12290;
[{Java2HtmlPlugin
package org.appfuse.dao;
import org.appfuse.model.Person;
public interface PersonDao extends Dao {
public Person getPerson(Long personId);
public void savePerson(Person person);
public void removePerson(Long personId);
}
}]
&#27880;&#24847;&#65292;&#22312;&#20197;&#19978;&#30340;&#26041;&#27861;&#22768;&#26126;&#19978;&#24182;&#27809;&#26377;exceptions&#35828;&#26126;&#65292;&#36825;&#26159;&#22240;&#20026;[Spring|http://www.springframework.org]&#20351;&#29992;RuntimeExceptions&#26469;&#21253;&#35065;Exceptions&#30340;&#26041;&#24335;&#65292;&#27492;&#26102;&#65292;&#20320;&#24050;&#32463;&#21487;&#20197;&#20351;&#29992;__ant compile-dao__&#26469;&#32534;&#35793;{{src/dao}}&#21644;{{test/dao}}&#19979;&#30340;&#25152;&#26377;&#28304;&#25991;&#20214;&#65292;&#28982;&#32780;&#24403;&#20320;&#36816;&#34892;__ant test-dao -Dtestcase=PersonDao__&#36827;&#34892;&#27979;&#35797;&#26102;&#65292;&#20320;&#20250;&#24471;&#21040;&#19968;&#20010;&#38169;&#35823;&#65306;<span style="color: red">No bean named 'personDao' is defined</span>&#65292;&#36825;&#26159;&#19968;&#20010;Spring&#30340;&#38169;&#35823;&#65292;&#35828;&#26126;&#20320;&#24517;&#39035;&#22312;{{applicationContext-hibernate.xml}}&#25351;&#23450;&#19968;&#20010;&#21517;&#23383;&#20026;''personDAO''&#30340;bean&#65292;&#22312;&#27492;&#20043;&#21069;&#25105;&#20204;&#38656;&#35201;&#21019;&#24314;PersonDao&#30340;&#23454;&#29616;&#31867;&#12290;

Back to CreateDAO_zh, or to the Page History.