路是爬出来的

#

今天又去见客户了

        今天跟市场的人去跑。见一个客户,都怪我连对方是什么样的情况都不了解,去的很匆忙。只知道是做外贸的,想做个网站。

去到一看,傻眼了。洋人。哈,幸好跟我同去的老板会英文。不知道他们在唧咕什么,后来都是老板跟我翻译,然后我提出一些要求,最后谈到价钱。整个过程就是这么简单。

       让我感受最深刻是要学英文了。不过最欣慰的是,那边的电脑都中毒了。因此认识了些女孩子,并加了QQ,说什么远程协助帮她杀毒。哈哈哈

       希望可以帮到她们,不过说实话,没有一个懂电脑的在身边,真的很惨,她那边是做外贸的,电脑一中毒,可能很多重要数据被偷,或者丢失,看来我们做软件的也还不错。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(122) | 评论 (0)编辑 收藏

续关于 j2me圈子的朋友有没兴趣大家一起做个冒险岛的游戏

     这两天忙着学习关于单元测试,游戏的事情放到放下了。趁着现在有点时间,把我自己一个简单的框架拿出来参考下。

这里用的人物图片资源是整合fins刚上传的一个游戏,

     在这里我说下简单的功能,

    1。mali只能向前走,走过了就回不了头了

     2。为能实现跳跃,跟出现关外

    3。人物只能之下行走,不能根据场景的路线判断行走,比如前方有个台阶,要跳跃。

    4,等大家提供了。哈哈

posted @ 2006-12-30 09:06 路是爬出来的 阅读(96) | 评论 (0)编辑 收藏

单元测试之测试目的

在javaeye学习一段时间单元测试后,虽然测试的文章不多,但都是经典帖子。同时也发现这里面讨论的关注点大部分是对测试的目。对于该怎么测试,怎么样才可以让测试自动话



,怎么样保持测试的实效性等讨论的比较少。



最近被公司逼的急了,它要求在这个月里写一篇关于单元测试的论文。无奈之下,只好来到这里记录下自己学习的点点滴滴。以方便自己以后整理成论文。



做事往往要带很强的目的性去做才可以成功,单元测试也不例外



单元测试目的:

首先保证代码质量。

其次保证代码的可维护。

再此保证代码的可扩展。



目的之一代码的代码质量

我们编写的代码虽然可以通过编译器检测到语法的正确性质,但并不能保证代码逻辑也是正确的。我们该怎么保证代码执行是正确的呢。好下面我们来看下代码。



java 代码


 


  1.    int add(int x, int y){  

  2.     return x+y;  

  3. }  





   上面的功能模块。下面是段测试代码

 
java 代码


 


  1. void testAdd(){  

  2.     //我们要求程序逻辑是1+4=5;  

  3.     assertEquals(5,add(1,4); 


  4. }



     经过测试以后,如果你修改了int add(int x, int y);里面的逻辑,如果修改的正确,测试代码始终都是见到绿色的。如果你逻辑错了。那不好意思,你的测试将会让你重新写那段逻辑代码。直到你正确为止。

     有个比较特殊的情况,如果我测试代码写成这样,那我保证逻辑代码的正确性,但我却看不到我期待的绿色,这有是什么原因呢?

java 代码


 


  1. 1void testAdd(){    

  2. 2.     //我们要求程序逻辑是1+4=5;    

  3. 3.     assertEquals(6,add(1,4);   

  4. 4. }  



我个人认为这个问题并是逻辑代码的问题,而是你测试代码中的逻辑问题,

噢,MyGot,作为程序员的我。已经为逻辑代码伤脑筋了。还要为测试代码烦恼,做人真命苦啊。  想来也确实是这样。

这就引申了另外一个问题,怎么样才可以保证我逻辑代码的可测性?



目的之二代码的可维护性。

就拿上面的例子来说吧。只要我们的单元测试是正确的,那我们就可以保证无论你怎么修改那段代码,只要测试代码可以产生绿色条,那OK,你修改的逻辑代码是正确的。当然可维护并非只有这点,还有,比如保证修改了这段代码不会影响到其他的模块等。



目的之三代码的可扩展。

对于这点我理解很肤浅。只能表达表面的东西,希望。

对于可扩展我觉得保遵循一个代码之间的耦合度降到最低。就OK了。单元测试对这方面有很强的好处,为了程序的可维护性,它可以强迫你写低耦合度的程序。





单元测试的优点


1、它是一种验证行为。

    程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。


2、它是一种设计行为。

    编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。


3、它是一种编写文档的行为。

    单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。


4、它具有回归性。

    自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。


单元测试的范畴




    如果要给单元测试定义一个明确的范畴,指出哪些功能是属于单元测试,这似乎很难。但下面讨论的四个问题,基本上可以说明单元测试的范畴,单元测试所要做的工作。


1、 它的行为和我期望的一致吗?

    这是单元测试最根本的目的,我们就是用单元测试的代码来证明它所做的就是我们所期望的。


2、 它的行为一直和我期望的一致吗?

    编写单元测试,如果只测试代码的一条正确路径,让它正确走一遍,并不算是真正的完成。软件开发是一个项复杂的工程,在测试某段代码的行为是否和你的期望一 致时,你需要确认:在任何情况下,这段代码是否都和你的期望一致;譬如参数很可疑、硬盘没有剩余空间、缓冲区溢出、网络掉线的时候。


3、 我可以依赖单元测试吗?

    不能依赖的代码是没有多大用处的。既然单元测试是用来保证代码的正确性,那么单元测试也一定要值得依赖。


4、 单元测试说明我的意图了吗?

    单元测试能够帮我们充分了解代码的用法,从效果上而言,单元测试就像是能执行的文档,说明了在你用各种条件调用代码时,你所能期望这段代码完成的功能。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(148) | 评论 (0)编辑 收藏

单元测试之实践一,关于设计的常见分层

        我做过的项目不多。也就几个。做项目的经历是个学习的过程。

       第一个项目,纯Jsp,没有任何的java类,当时就觉得好郁闷啊。做久了,根本找不到北。

       第2个项目:开始会用些javabean来做了。但是还是一个字好乱。

       第3个项目:开始使用hibernate, 只是对数据库层做了些简单的封装,修改起来比较好了点

       第4个项目:研究Webwork+spring+hibernate。终于实现了所谓的MVC了。哈哈,该起程序来终于开始有点爽了。

      第5个项目: 开始引入了单元测试,现在还在很懵懂在学习中,为了更好的测试,我们开始努力写出更高质量的代码。所以对软件的分层更细致了些。



      我们可以从测试来分出上的设计的好坏。

      1,纯jsp,根本无从单元测试,我想就是那些大牛们也很难写出这样的测试代码吧

      2,对于纯粹只有get/set的javabean而言,我想应该是没有必要做单元测试的。如果有逻辑代码的话,测试起来也是相当困难的,因为你不知道里面的逻辑代码跟多少个类大了交道,你会为了测试这段代码,建立相关的环境,比如启动EJB,Web容器等。跟难预料的是,跟你耦合的类未必就是正确的,其实你的测试代码跟你的javabean逻辑是对的,但是因为你引用的类(也就是耦合类)的逻辑是错误的,这将导致你的测试是个红色,“真的很抱歉,其实我也不想这样的,单元测试说”。 这样就足以证明是你的设计问题了。并不是单元测试的问题。所以说第个项目测试是很难测是的。只是比不能测试好一点点。

      3,至于第3个跟第2个差不多。

      4,第4个由于对每个层做了细致设计,所以设计测试代码容易点,而且可以通过easymock等工具进行分层测试,这样可以做到更细粒度的测试,对测试覆盖率也是很有帮助的。下面我将主要通过第4个项目的用户注册例子来讲单元测试的各个方面。



先看下,源代码的包结构。





接下来看下流程图。

可以很清楚的知道,没一层做些什么工作,接下的文章,我将会根据我的设计习惯,一一给出他们相应的测试代码。希望高手们指教。

我不会绘制UML图,所以只好手工来画,可惜手机像素不高,所以。。。。





posted @ 2006-12-30 09:06 路是爬出来的 阅读(148) | 评论 (0)编辑 收藏

单元测试之实践二,关于DAO的测试

       前阵子发表过 我的第一个真正意义上的测试

里面对于测试Service大家是没有意义的,对于测试DAO层则表现各有各的看法。

比如

robbin     大哥建议:


测试DAO不如连数据库一起测试吧。因为DAO测试的目的不是DAO接口实现对不对,而是测试是否如你预期的发送了SQL,如你预期的返回了结果集。这个时候你Mock之后,测试就没有意义了。



hyysguyang      大哥建议:篇

wuhua 写道

分层的原因很多。这里我的看法片面就不说了

但对于mock来说是有莫大好处的。

比如service测试的时候完全可以做到隔离数据库,

我现在的意思是,

居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代 替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test, Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗



但是数据库的测试毕竟比较特殊,记住测试的目的是确保你的代码质量,如果你确定你的这样测就没问题了,那无话可说,否则就尽量多的测试。

事实上,最原始的单元测试(plain testcase)就是用来测方法,测业务逻辑的,如果有逻辑就测,没逻辑就不用测了,同样的道理,相信你不会去测一个bean的get/set方法吧。

记住你测试的目的和动机,如果你认为测试dao层是为了测你的逻辑(你确定你的dao的实现代码是否真的存在逻辑),那你就mock吧,但是,我 们更相信,我们测DAO层,更应该是测访问数据库的情况,你如连接,sql是否正确,sequence是否正确等,而这些你必须要真正的连接数据库,也因 此,我们一般都是直接访问数据库来测试的,当然,如果可能你可以采用内存库。

事实上,我们对dao的测试,一般都进行所谓的的集成单元测试。我认为,你应该确定好你的测试策略,然后在去采用相应的测试方法。我在目前的开发中就是采用这样的方式测的。


上面两个大哥都建议测试DAO的时候还是连接数据库为好。

但个人认为上面两个大哥的单元测试以非纯正的单元测试了,而是集成单元测试。

其实说白了,测试这东西只是为了项目更好,更快的完成。至于是否要求纯单元,或者是集成单元测试,则看各位的需要,如果觉得集成单元测试对项目有帮助,那就用吧,现在发现对这个已经没有明显的界限了。





不理会它了,现在回归到我们用户注册的例子。

java 代码


 


  1. 1public interface IAccountDao extends IBaseDao {    

  2. 2.     public Account findAccountById(String id);    

  3. 3.     public Account findAccounByName(String name);    

  4. 4. }   





实际实现代码

java 代码


 


  1. package org.wuhua.dao.impl;  

  2.   

  3. import java.util.List;  

  4.   

  5. import org.wuhua.dao.IAccountDao;  

  6. import org.wuhua.model.Account;  

  7.   

  8. public class AccountDao extends BaseDao implements IAccountDao {  

  9.   public Account findAccountById(String id) {  

  10.         return (Account) this.getHibernateTemplate().get(Account.class, id) ;  

  11.     }  

  12.   

  13.     public Account findAccounByName(String name) {  

  14.         List l = this.getHibernateTemplate().find("from Account as a where a.name=?", name);  

  15.         if(l != null && l.size() >=1)  

  16.             return (Account) l.get(0);  

  17.         else   

  18.             return null;  

  19.     }  

  20. }  





java 代码


 


  1. package org.wuhua.dao;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.List;  

  5.   

  6. import junit.framework.Assert;  

  7. import junit.framework.TestCase;  

  8.   

  9. import org.easymock.MockControl;  

  10. import org.easymock.classextension.MockClassControl;  

  11. import org.springframework.orm.hibernate3.HibernateTemplate;  

  12. import org.wuhua.dao.impl.AccountDao;  

  13. import org.wuhua.model.Account;  

  14.   

  15.    

  16.   

  17. public class AccountDaoTest extends TestCase {  

  18.       

  19.     private AccountDao accountDao;  

  20.     private org.springframework.orm.hibernate3.HibernateTemplate ht;  

  21.     private MockControl control;  

  22.   

  23.     protected void setUp() throws Exception {  

  24.         control = MockClassControl.createControl(HibernateTemplate.class);  

  25.         ht = (HibernateTemplate) control.getMock();  

  26.         accountDao = new AccountDao();  

  27.         accountDao.setHibernateTemplate(ht);  

  28.     }  

  29.   

  30.     protected void tearDown() throws Exception {  

  31.            

  32.     }  

  33.       

  34.     public void testFindAccountById(){  

  35.         Account a = new Account("wuhua");  

  36.         a.setId("10");     

  37.           

  38.         ht.get(Account.class, a.getId());  

  39.           

  40.         control.setReturnValue(a);  

  41.           

  42.         control.replay();  

  43.           

  44.         Account result =   accountDao.findAccountById(a.getId());  

  45.           

  46.         assertNotNull(result);  

  47.   

  48.         Assert.assertEquals(a.getId(),result.getId());  

  49.         Assert.assertEquals(a, result);  

  50.           

  51.         control.verify();  

  52.           

  53.     }  

  54.       

  55.     public void testFindAccountByName(){  

  56.         Account a = new Account("wuhua");      

  57.            

  58.         ht.find("from Account as a where a.name=?", a.getName());  

  59.         List l = new ArrayList();  

  60.         l.add(a);  

  61.         control.setReturnValue(l);  

  62.           

  63.         control.replay();  

  64.           

  65.         Account result =  accountDao.findAccounByName(a.getName());  

  66.   

  67.         Assert.assertEquals(a.getId(),result.getId());  

  68.         Assert.assertEquals(a, result);  

  69.           

  70.         control.verify();  

  71.           

  72.     }  

  73. }  


posted @ 2006-12-30 09:06 路是爬出来的 阅读(123) | 评论 (0)编辑 收藏

单元测试之实践三 Service的测试

测试Service,因为Service依赖的Dao, 所以只需Mock一个Dao即可。在这里我详细的介绍关于注册这个功能的测试

java 代码


 


  1. public interface IAccountService extends IBaseService {  

  2.       Account findAccountById(String id);  

  3.       Account findAccounByName(String name);  

  4.       void regist(Account account) throws ObjectExistsException;  

  5. }  



   注册功能的实现。
java 代码


 


  1. public void regist(Account account) throws ObjectExistsException {  

  2.     if(accountDao.findAccounByName(account.getName()) != null)  

  3.         throw new ObjectExistsException("User's name is exists!");  

  4.       

  5.     accountDao.save(account);  

  6. }  





测试代码
java 代码


 


  1.     protected void setUp() throws Exception {  

  2.         control = MockControl.createControl(IAccountDao.class);  

  3.         accountDao = (IAccountDao) control.getMock();  

  4.         as = new AccountService();  

  5.         as.setAccountDao(accountDao);  

  6.     }  

  7.   

  8.   

  9. public void testFindAccountByName() {  

  10.         String name = "wuhua";  

  11.         accountDao.findAccounByName(name);  

  12.         Account a = new Account("wuhua");  

  13.         a.setId(name);  

  14.         control.setReturnValue(a);  

  15.         control.replay();  

  16.         Account at = as.findAccounByName(name);  

  17.         Assert.assertEquals(name, at.getId());  

  18.         Assert.assertEquals(a, at);  

  19.         control.verify();  

  20.     }  





首先我们建立一个关键字查询,name="wuhua";

然后调用Dao的方法,

然后自定义返回一个自己预期的对象,

最后通过比较这个对象判断结果是否是自己想要的

posted @ 2006-12-30 09:06 路是爬出来的 阅读(346) | 评论 (0)编辑 收藏

单元测试之实践四 Action的测试

       Action的测试是比较辛苦的。因为它依赖与其他的环境(比如tomcat)。

       在我的印象中,基于struts的测试是很麻烦的,因为对于execute方法,你必须mock两个对象进去。

      还好。基于Webwork的测试相对简单些。

      下面让我们来测试一个例子吧

      

java 代码


 


  1.       Account account;  

  2. IAccountService accountService;  

  3. public void setAccount(Account account) {  

  4.     this.account = account;  

  5. }  

  6.   

  7. public void setAccountService(IAccountService accountService) {  

  8.     this.accountService = accountService;  

  9. }  

  10.   

  11. public String regist() throws Exception {  

  12.     if(account == null) {  

  13.         account = new Account();  

  14.         return INPUT;  

  15.     }  

  16.       

  17.     if(!validForm(account))   

  18.         return INPUT;  

  19.       

  20.     try {  

  21.         accountService.regist(account);  

  22.     } catch (ObjectExistsException e) {  

  23.         e.printStackTrace();  

  24.         return INPUT;  

  25.     }  

  26.       

  27.     return SUCCESS;  

  28. }  

  29.   

  30. private boolean validForm(Account e) {  

  31.     if(e.getName() == null || e.getName().trim().equals(""))  

  32.         return false;  

  33.     if(e.getPassword() == null || e.getPassword().trim().equals(""))  

  34.         return false;  

  35.     return true;  

  36. }  





有经验的程序员见到上面的代码应该就知道怎么测试了。

我们只需setAccount,跟setAccountService即可,

而Account本身来讲就是是个po,所以可以自己new一个

AccountService则可以mock一个。真是太完美了,我太喜好mock,它总是给我惊喜

java 代码


 


  1. package org.wuhua.action;  

  2.   

  3. import junit.framework.TestCase;  

  4.   

  5. import org.easymock.MockControl;  

  6. import org.wuhua.exception.ObjectExistsException;  

  7. import org.wuhua.model.Account;  

  8. import org.wuhua.service.IAccountService;  

  9.   

  10. import sms.king.AccountManager;  

  11.   

  12. import com.opensymphony.xwork.Action;  

  13.   

  14. public class AccountActionTest extends TestCase {  

  15.     private MockControl control;  

  16.     IAccountService accountService;  

  17.     protected void setUp() throws Exception {  

  18.         control = MockControl.createControl(IAccountService.class);  

  19.         accountService = (IAccountService) control.getMock();  

  20.            

  21.     }  

  22.       

  23.     public void testRegistOk() throws Exception {  

  24.         Account employee = new Account("name");  

  25.         employee.setPassword("password");  

  26.           

  27.        

  28.            

  29.           

  30.         accountService.regist(employee);  

  31.         control.setVoidCallable(1);  

  32.           

  33.         control.replay();  

  34.           

  35.         AccountAction action = new AccountAction();  

  36.         action.setAccount(employee);  

  37.         action.setAccountService(accountService);  

  38.           

  39.         assertEquals(Action.SUCCESS, action.regist());  

  40.           

  41.         control.verify();  

  42.     }  

  43.       

  44.     public void testRegistNameExists() throws Exception {  

  45.         Account employee = new Account("name");  

  46.         employee.setPassword("password");  

  47.           

  48.    

  49.        

  50.           

  51.         accountService.regist(employee);  

  52.         control.setThrowable(new ObjectExistsException(""));  

  53.           

  54.         control.replay();  

  55.           

  56.         AccountAction action = new AccountAction();  

  57.         action.setAccount(employee);  

  58.         action.setAccountService(accountService);  

  59.           

  60.         assertEquals(Action.INPUT, action.regist());  

  61.           

  62.         control.verify();  

  63.     }  

  64. }  



 

ok,一个测试的例子就好了。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(151) | 评论 (0)编辑 收藏

这年头谁不浮躁

      都说程序员很浮躁,动不动就那跳槽威胁公司,以提高自己的价值。

      但是真的就是这样吗? 你看海尔,你看联想,TCL那个不浮躁,动不动就说什么国际话走出中国市场。它们就是不甘于现状,敢于浮躁。这不就是为了提高自己的竞争力吗?  

      浮躁本没罪,被人骂多了就有罪了。浮躁是人不安现在的本能反映,它足以摧毁一切,想想要是邓爷爷也安于现状,当时人家的年龄可是7老8十的,人家干吗这么拼命啊。还不是浮躁,觉得应该给全国人们一个好的生活。

      我们浮躁也还不是为了更好的生活。浮躁让人觉得有生机勃勃。

      浮躁本没罪,有罪的是浮躁这个词语。

posted @ 2006-12-30 09:06 路是爬出来的 阅读(90) | 评论 (0)编辑 收藏

单元测试总篇与TTD实践

        经过前几篇的测试学习跟实践,我觉得有必要对这次学习做个总结。其实上面的话只是幌子,主要原因还是javaeye的

lighter 写道

貌似这一篇文章要放在"agile"版块更好一些吧.

btw:wuhua同学写文章有时候可以把两篇结合成一篇,可能会更好一些,不然让别人看一篇文章要看一,二,三,四才能看完.个人建议而已,别见怪.



觉得他说的很对,当时是出于篇幅过程,怕javaeye blog不支持大篇幅的文章,所以拆开。不过我觉得我这个担心是多余的。这里说句题外话,我用过很多Blog,但觉得这里是最好的。速度快,写文章贴心(主要是对源代码格式化方面做的很出色)。



好了,进入正题。

先介绍下我以前写的那些文章先,让大家对这篇文章有个初步的认识。

单元测试之测试目的,

单元测试之实践一,关于设计的常见分层

单元测试之实践二,关于DAO的测试

单元测试之实践三 Service的测试









单元测试之实践四 Action的测试



以前我正常的设计流程是Database->Model -> Dao-> Service -> Action ->View。这样的设计伴随我1年多了,这样的设计方式好吗?这样的设计高效吗? 代码质量能保证吗? 我可以很肯定的回答,不能,如果数据库一该,我要在表格里面添加一个字段,或者什么的。那么它将会牵连到很多其他,修改的动作如下:Database->Model -> Dao-> Service -> Action ->View。 噢,my got,几乎跟设计的一样多,甚至更多,因为在修改的过程中你就算有再好IDE去重构它也不能保证它的正确性。然后你就要去测试,测试它的正确性。也许测试的过程将是修改过程的几倍时间。所以我个人觉得这样的设计方式是不高效的。总而言之就是这样的设计迟早会出问题的?



为什么会这样呢?难道就没有一种解决办法吗? 经过这段日子学习我发现,以前的设计不能很好的保证质量是因为你没有足够的单元测试去支撑着它,所以你改了代码后缺乏一个很好的手段去保持这段代码的质量,换句话的意思就是,没有一个静态的人去监督你的工作(我把单元测试比喻为静态的人,它只做一件事,就是督促你的代码不出问题)。



好了。我们已经找到了适合保证我们代码质量的方法了。但是我们还得提高我们的开发效率啊。这又怎么办呢?是不是还按照以前的方式吗?我想自己浑浑噩噩的活了20多年了。我想换种活法了,想找种更刺激,更有意义的生活方式。

设计有时候更生活是一样的,应该经常探索,经常实践才能感受的更多。

那好吧我们就来个彻底的变革吧。怎么变呢? 很明显:那就是TDD。

该怎么做呢?

以前的方式:Database->Model -> Dao-> Service -> Action ->View。

TDD的方式:Test->其他。

先看看下面Dao的例子吧:以前的方式:IBaseDao ->  BaseDao -> BaseDaoTest。

TDD:BaseDaoTest->IBaseDao->BaseDao.


 


  1. public void testFindAccountByName(){  

  2.     Account a = new Account("wuhua");      

  3.     ht.find("from Account as a where a.name=?", a.getName());  

  4.     List l = new ArrayList();  

  5.     l.add(a);  

  6.     control.setReturnValue(l);  

  7.     control.replay();  

  8.     Account result =  accountDao.findAccounByName(a.getName());  

  9.     Assert.assertEquals(a.getId(),result.getId());  

  10.     Assert.assertEquals(a, result);  

  11.     control.verify();  

  12.       

  13. }  



好,非常好,怎么这段代码不能运行呢?当然不行了,因为上面的很多类都没有。那我们这段代码的用途是什么呢?

用途就是:以为上面的从上面的代码我很清楚自己以后要做什么。1,要建立一个Model,里面起码有一个name属性,然后你会发现我们要测试的功能段是accountDao.findAccounByName(a.getName()); 里面我们要求测试的SQL是from Account as a where a.name=?,意图明确吧。好,



我们写下实际代码吧。

java 代码



  1. public Account findAccounByName(String name) {  

  2.         List l = this.getHibernateTemplate().find("from Account as ", name);  

  3.         if(l != null && l.size() >=1)  

  4.             return (Account) l.get(0);  

  5.         else   

  6.             return null;  

  7.     }  



好,代码写好了。去运行我们的测试吧。结果是令人失望的。怎么会是红色的呢。肯定是逻辑代码出问题了(如果测试代码没问题的话)。经过检查发现原来
from Account as a where a.name=?跟from Account as 完全两码事。好改回去



java 代码


 


  1. public Account findAccounByName(String name) {  

  2.         List l = this.getHibernateTemplate().

  3.                              find("from Account as a where a.name=?", name);  

  4.         if(l != null && l.size() >=2)  

  5.             return (Account) l.get(0);  

  6.         else   

  7.             return null;  

  8.     } 



怎么还是红色啊。我不干了(程序员暴躁的情绪出来了,我就经常这样)主管跟我说:“再查查吧。别灰心。”

后来查了半天发现原来

java 代码


 


  1. List l = new ArrayList();    

  2.  l.add(a);   



我只renturn一个预期的对象a
java 代码


 


  1. if(l != null && l.size() >=2)  

  2.             return (Account) l.get(0);  

  3.         else   

  4.             return null;  



而代码却要求我要传入预期两个对象才给我通过,所以代码只return null。



最后改了这段代码

java 代码


 


  1. public Account findAccounByName(String name) {  

  2.         List l = this.getHibernateTemplate().find("from Account


  3.                                         as a where a.name=?", name);  

  4.         if(l != null && l.size() >=1)  

  5.             return (Account) l.get(0);  

  6.         else   

  7.             return null;  

  8.     }  





终于通过了。绿色,绿色,我看到了。我对主管说。主管笑了。我也笑了



最后我郁闷下,写这篇文章足足话了我22个小时,

第一次写好了。杀毒突然重启。所以全没了。

第二次,提交不了。然后忘记备份,又全没了

第三次成功了。过程跟TDD差不多。







posted @ 2006-12-30 09:06 路是爬出来的 阅读(255) | 评论 (0)编辑 收藏

90个外国英文网站强力推荐 (转)

文章转自http://www.j2medev.com/blog/user2/titoudao/archives/2006/2401.html

主要收藏用。

一、大陆可访问的优秀英文信息源

1、英国《经济学家》
http://www.economist.com

2、美联社
http://wire.ap.org/GoToAP.cgi

3、英国BBC
http://news.bbc.co.uk

4、《纽约时报》
http://www.nytimes.com

5、普利策新闻奖1995年到2001年全部获奖作品
http://www.pulitzer.org

6、美国全国广播公司
http://www.msnbc.com/news

7、《华尔街日报》评论
http://www.opinionjournal.com

8、香港《南华早报》
http://china.scmp.com/index.html



二、新闻收藏夹

1、CNN可以直接访问的地址
http://asia.cnn.com(亚洲版)

2、CNN可以通过代理服务器访问的地址
http://207.25.71.5(国际版)

3、BBC可以通过代理服务器访问的地址
http://212.58.240.36

4、《华盛顿邮报》社论版 可以通过代理服务器访问的地址:
http://64.215.175.141/wp-dyn/opinion



三、英美外电新闻

1、《泰晤士报》
http://www.thetimes.co.uk

2、《基督教科学箴言报》
http://www.csmonitor.com

3、《今日美国》
http://usatoday.com

4、美国广播公司
http://abcnews.go.com

5、英国《观察家》
http://www.observer.co.uk

6、英国《每日电讯》
http://www.dailytelegraph.co.uk



四、英美周刊杂志

1、《每周标准》
http://www.weeklystandard.com

2、《外交事务杂志》
http://www.foreignaffairs.orghttp:/...eignaffairs.org

3、《沙龙》
http://www.salon.com

4、《美国观察者》
http://www.gilder.com/amspec/index.html

http://www.gilder.com/amspec/index.html

http://www.gilder.com/amspec/index.html

5、《新共和》
http://www.tnr.com/

6、《国家评论》
http://www.nationalreview.com

7、《国家杂志》
http://nationaljournal.com/about/njweekly/stories/

8、《纽约客》
http://www.newyorker.com/

9、《纽约书评》
http://www.nybooks.com/

10、《外交政策》
http://www.foreignpolicy.com/

11、《大西洋月刊》The Atlantic Onlinehttp://www.theatlantic.com//

12、《外交政策聚焦》
http://www.foreignpolicy-infocus.org/

13、《民族》The Nationhttp://www.thenation.com/

14、《进步》Homepage of The Progressive magazine
http://www.progressive.org/

15、《洋葱》
http://www.theonion.com/(有趣新闻站点)



五、时事资料

1、安全政策研究中心
http://www.centerforsecuritypolicy.org/

2、美国国务院各国背
http://www.state.gov/r/pa/bgn/

3、世界各国地图
http://www.lib.utexas.edu/maps/index.html

4、卫星照片
http://www.spaceimaging.com/

5、网上各国政府资料
http://www.gksoft.com/govt/en/

6、中国外交部各国背景
http://www.fmprc.gov.cn/chn/c242.html



六、英美常用经济网站

1、《金融时报》
http://news.ft.com/home/rw

2、《商业周刊》
http://news.ft.com/home/rw

3、《财富》
http://www.fortune.com/fortune

4、《远东经济评论》
http://www.feer.com

5、《福布斯》
http://www.forbes.com

6、哥伦比亚广播公司《市场观察》
http://cbs.marketwatch.com/news/default.asp?siteid=mktw

7、《街》
http://www.thestreet.com/



七、非英美周刊杂志和资料站点

1、德国《镜报》
http://www.spiegel.de/spiegel(点击English Texts)

2、教廷《罗马观察家》
http://www.vatican.va/news_services..._eng/index.html

3、捷克《布拉格邮报》
http://www.praguepost.cz/

4、《俄罗斯周刊》
http://www.russiajournal.com/

5、英国《简氏防务周刊》
http://www.janes.com/(出色的军事杂志)

6、埃及《中东时报》
http://www.metimes.com/

7、《巴勒斯坦时报月刊》
http://www.ptimes.com/

8、巴勒斯坦《耶路撒冷时报》
http://www.jerusalem-times.net/

9、埃及《Al-Ahram周刊》
http://www.ahram.org.eg/weekly/

10、阿富汗研究
http://www.institute-for-afghan-studies.org/

11、中东新
http://www.middleeastwire.com/

12、以色列DEBKA档案
http://www.debka.com/(一个情报站点)

13、保加利亚《首都周刊》
http://www-us.capital.bg/old/weekly/index.html

14、皇帝的新装
http://www.emperors-clothes.com;

15、全球主义者
http://www.theglobalist.com/

16、台湾《东森新闻报》
http://www.ettoday.com/

by
http://www.hjenglish.com



八、非英美外电新闻

1、《东盟新闻》
http://www.aseanreview.com

2、菲律宾《星报》
http://www.philstar.com/htmtest/index.htm

3、菲律宾《每日调查》
http://www.inq7.net/

4、印尼《雅加达邮报》
http://www.thejakartapost.com/headlines.asp

5、新加坡《海峡时报》
http://straitstimes.asia1.com.sg/home

6、巴基斯坦《黎明报》
http://www.dawn.com

7、《印度时报》
http://www.timesofindia.com

9、尼泊尔新闻
http://www.nepalnews.com.np

10、德国《法兰克福汇报
http://www.faz.com/IN/INtemplates/eFAZ/default.asp

11、俄罗斯《莫斯科时报》
http://www.moscowtimes.ru

12、保加利亚《新闻报》
http://news.bg/en/

13、保加利亚《索菲亚回声报》
http://www.sofiaecho.com/

14、《爱尔兰时报》
http://www.ireland.com/

15、以色列《哈阿雷兹》
http://www.haaretzdaily.com/

16、伊拉克新闻
http://www.uruklink.net/iraqnews/eindex.htm

17、《约旦时报》
http://www.jordantimes.com

18、阿联酋《Khaleej时报》
http://www.khaleejtimes.com/

19、古巴《格拉玛》
http://www.granma.cu/ingles/index.html

20、阿根廷《布宜诺斯艾利斯先驱报》
http://www.buenosairesherald.com

21、泛非洲在线
http://allafrica.com/

22、联合国新闻中心
http://www.un.org/News

23、可以在线阅读英文小说
http://hnbc.hpe.sh.cn/01/01A/04/UVWX.HTM

24、《时代周刊》
www.time.com

25、《国家地理》
http://www.nationalgeographic.com

26、《新闻周刊》
http://www.msnbc.com/news/NW-front_Front.asp

posted @ 2006-12-30 09:06 路是爬出来的 阅读(133) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页