ssh2单元测试和集成测试
单元测试
用来检验目标代码中很小的一部分。通常一个单元测试用于判断某个特定条件或者特定场景下的某个特定函数的行为。如果对某个功能模块进行单元测试时,我们希望屏蔽对外在功能模块的屏蔽,以便将焦点放在目标模块的测试上,可以使用虚拟对象模拟外在模块的行为。这样单元测试可以假想在外在模块正确的情况下本模块的逻辑的正确性了。单元测试下不应该依赖于spring容器,通过模拟对象完成单元测试。
如下是对Action的单元测试
UserAction
- @ParentPackage(“default”)
- @Namespace(“/user”)
- public class UserAction extends ActionSupport{
- @Autowired
- private IUserService userService;
- private User user;
- @Action(value = “test”, results = {@Result(name = “success”, location = “/index.jsp”)})
- public String test() {
- try{
- userService.save(user);
- return SUCCESS;
- }catch(Exception e){
- e.printStackTrace();
- return “error”;
- }
- }
- @Action(value = “test2”, results = {@Result(name = “success”, location = “/index.jsp”)})
- public String test2() {
- try{
- User user=userService.findUser(getUser().getId());
- if(user.getName().equals(“xxx”))
- return SUCCESS;
- else
- throw new Exception();
- }catch(Exception e){
- e.printStackTrace();
- return “error”;
- }
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public IUserService getUserService() {
- return userService;
- }
- public void setUserService(IUserService userService) {
- this.userService = userService;
- }
- }
UserService
- public class UserService implements IUserService{
- @Autowired
- private UserDao userDao;
- @Transactional
- public void save(User userObject)throws Exception {
- try{
- if(userObject.getName().equals(“admin”))
- throw new Exception(“fuck”);
- userDao.save(userObject);
- }catch(Exception e){
- throw e;
- }
- }
- public User findUser(long id){
- return userDao.findById(id);
- }
- }
YhActionTest
- public class YhActionTest extends AbstractModelAndViewTests {
- public void testYhlist(){
- MockHttpServletRequest request=new MockHttpServletRequest();
- MockHttpSession session=new MockHttpSession();
- request.setSession(session);
- UserAction mAction=new UserAction();
- IUserService yhService= EasyMock.createMock(IUserService.class);
- mAction.setUserService(yhService);
- User yh=new User();
- yh.setId(100);
- yh.setName(“xxx”);
- yh.setPassword(“xxxx”);
- EasyMock.expect(yhService.findUser(yh.getId())).andReturn(yh);
- EasyMock.replay(yhService);
- mAction.setUser(yh);
- String r=mAction.test2();
- assertEquals(r, “success”);
- EasyMock.verify(yhService);
- }
MockHttpServletRequest ,MockHttpSession 是虚拟的request,session,因为不是web环境中,所以需要虚拟这两个对象,(本测试没用到)。IUserService yhService= EasyMock.createMock(IUserService.class);是虚拟一个服务类实例。
集成测试
集成测试是在功能完成后,验证模块之间匹配调用的正确性而进行的测试。一般对业务层和web层进行集成测试。集成测试应该是事先装配好模块和模块之间的关联。因此需要spring配置文件的作用,启动spring容器。
建立测试目录
test/action test/service
将applicationContext.xml和dataSource.properties放到test根目录下面。另struts.xml需要在src根目录下。因为不是启动web容器,所以,不会将web-inf中的applicationContext.xml和dataSource.properties加载进classes路径中。所以需要放到test下面。
test/action/UserActionTest
测试action+service+dao
- public class UserActionTest extends StrutsSpringTestCase{
- private UserAction mAction;
- private ActionProxy proxy;
- @Override
- public String[] getContextLocations() {
- return new String[]{“classpath:applicationContext.xml”};
- }
- public void testLogin() throws Exception {
- User user=new User();
- user.setName(“yuyong”);
- user.setPassword(“890806”);
- proxy = getActionProxy(“/user/test”);
- mAction = (UserAction) proxy.getAction();
- mAction.setUser(user);
- assertEquals(“success”,mAction.test());
- user.setName(“admin”);
- mAction.setUser(user);
- assertEquals(“error”,mAction.test());
- }
- }
test/action/AbstractSpringContextTests1
测试service+dao
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations= “classpath:applicationContext.xml”)
- @TransactionConfiguration(defaultRollback=true)
- @Transactional
- public class AbstractSpringContextTests1{
- @Resource
- private IUserService yhService;
- @Test
- public void save() throws Exception {
- User user=new User();
- user.setName(“admin”);
- user.setPassword(“134”);
- yhService.save(user);
- }
- }