单元测试之实践4 Action的测试
单元测试之实践四 Action的测试Action的测试是比较辛苦的。因为它依赖与其他的环境(比如tomcat)。?????? 在
单元测试之实践四 Action的测试
Action的测试是比较辛苦的。因为它依赖与其他的环境(比如tomcat)。
?????? 在我的印象中,基于struts的测试是很麻烦的,因为对于execute方法,你必须mock两个对象进去。
????? 还好。基于Webwork的测试相对简单些。
????? 下面让我们来测试一个例子吧
??????
java 代码?
- ??????Account?account;?? IAccountService?accountService;??
- public?void?setAccount(Account?account)?{?? ????this.account?=?account;??
- }?? ??
- public?void?setAccountService(IAccountService?accountService)?{?? ????this.accountService?=?accountService;??
- }?? ??
- public?String?regist()?throws?Exception?{?? ????if(account?==?null)?{??
- ????????account?=?new?Account();?? ????????return?INPUT;??
- ????}?? ??????
- ????if(!validForm(account))??? ????????return?INPUT;??
- ?????? ????try?{??
- ????????accountService.regist(account);?? ????}?catch?(ObjectExistsException?e)?{??
- ????????e.printStackTrace();?? ????????return?INPUT;??
- ????}?? ??????
- ????return?SUCCESS;?? }??
- ?? private?boolean?validForm(Account?e)?{??
- ????if(e.getName()?==?null?||?e.getName().trim().equals(""))?? ????????return?false;??
- ????if(e.getPassword()?==?null?||?e.getPassword().trim().equals(""))?? ????????return?false;??
- ????return?true;?? }??
有经验的程序员见到上面的代码应该就知道怎么测试了。
我们只需setAccount,跟setAccountService即可,
而Account本身来讲就是是个po,所以可以自己new一个
AccountService则可以mock一个。真是太完美了,我太喜好mock,它总是给我惊喜
java 代码?
- package?org.wuhua.action;?? ??
- import?junit.framework.TestCase;?? ??
- import?org.easymock.MockControl;?? import?org.wuhua.exception.ObjectExistsException;??
- import?org.wuhua.model.Account;?? import?org.wuhua.service.IAccountService;??
- ?? import?sms.king.AccountManager;??
- ?? import?com.opensymphony.xwork.Action;??
- ?? public?class?AccountActionTest?extends?TestCase?{??
- ????private?MockControl?control;?? ????IAccountService?accountService;??
- ????protected?void?setUp()?throws?Exception?{?? ????????control?=?MockControl.createControl(IAccountService.class);??
- ????????accountService?=?(IAccountService)?control.getMock();?? ???????????
- ????}?? ??????
- ????public?void?testRegistOk()?throws?Exception?{?? ????????Account?employee?=?new?Account("name");??
- ????????employee.setPassword("password");?? ??????????
- ??????? ???????????
- ?????????? ????????accountService.regist(employee);??
- ????????control.setVoidCallable(1);?? ??????????
- ????????control.replay();?? ??????????
- ????????AccountAction?action?=?new?AccountAction();?? ????????action.setAccount(employee);??
- ????????action.setAccountService(accountService);?? ??????????
- ????????assertEquals(Action.SUCCESS,?action.regist());?? ??????????
- ????????control.verify();?? ????}??
- ?????? ????public?void?testRegistNameExists()?throws?Exception?{??
- ????????Account?employee?=?new?Account("name");?? ????????employee.setPassword("password");??
- ?????????? ???
- ??????? ??????????
- ????????accountService.regist(employee);?? ????????control.setThrowable(new?ObjectExistsException(""));??
- ?????????? ????????control.replay();??
- ?????????? ????????AccountAction?action?=?new?AccountAction();??
- ????????action.setAccount(employee);?? ????????action.setAccountService(accountService);??
- ?????????? ????????assertEquals(Action.INPUT,?action.regist());??
- ?????????? ????????control.verify();??
- ????}?? }??
?
ok,一个测试的例子就好了。