首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

easymock课程-单元测试中的主要测试对象和依赖

2012-08-08 
easymock教程-单元测试中的主要测试对象和依赖???? 在单元测试中,通常我们都会有一个明确的测试对象,我们

easymock教程-单元测试中的主要测试对象和依赖

???? 在单元测试中,通常我们都会有一个明确的测试对象,我们测试的主要目的就是为了验证这个类的工作如我们预期。

?

???? 以下面的简单代码为例:

?

easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????public?interface?UserService?{
easymock课程-单元测试中的主要测试对象和依赖????????????User?query(String?userId);
easymock课程-单元测试中的主要测试对象和依赖????????}
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????public?class?UserServiceImpl?implements?UserService?{
easymock课程-单元测试中的主要测试对象和依赖????????????private?UserDao?userDao;?
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????????public?User?query(String?userId)?{
easymock课程-单元测试中的主要测试对象和依赖????????????????return?userDao.getById(userId);
easymock课程-单元测试中的主要测试对象和依赖????????????}
easymock课程-单元测试中的主要测试对象和依赖????????????
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????????public?void?setUserDao(UserDao userDao)?{
easymock课程-单元测试中的主要测试对象和依赖????????????????this.userDao?=?userDao;
easymock课程-单元测试中的主要测试对象和依赖????????????}
easymock课程-单元测试中的主要测试对象和依赖????????}
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????public?interface?UserDao?{
easymock课程-单元测试中的主要测试对象和依赖????????????User?getById(String?userId);
easymock课程-单元测试中的主要测试对象和依赖????????}
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????public?class?UserDaoImpl?implements?UserDao?{
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖????????????private?Datasource?dataSource;
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????????public?User?getById(String?id)?{
easymock课程-单元测试中的主要测试对象和依赖????????????????User?user?=?new?User();
easymock课程-单元测试中的主要测试对象和依赖????????????????//execute?database?query
easymock课程-单元测试中的主要测试对象和依赖????????????????user.set..
easymock课程-单元测试中的主要测试对象和依赖????????????????return?user;
easymock课程-单元测试中的主要测试对象和依赖????????????}
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????????????public?void?setDatasource(Datasource?datasource)?{
easymock课程-单元测试中的主要测试对象和依赖????????????????this.datasource?=?datasource;
easymock课程-单元测试中的主要测试对象和依赖????????????}
easymock课程-单元测试中的主要测试对象和依赖????????????
easymock课程-单元测试中的主要测试对象和依赖????????}



??? 这里我们定义有两个interface: UserService 和 UserDao, 并给出了两个实现类UserServiceImpl 和 UserDaoImpl。 其中UserServiceImpl依赖到UserDao,通过setter方法可以注入一个UserDao实现。而UserDaoImpl的实现则依赖到Datasource。

?

????? 然后我们来为实现类UserServiceImpl 和 UserDaoImpl编写单元测试:

?

?1. UserServiceImplTest

easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖public?class?UserServiceImplTest?{
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖????@Test
easymock课程-单元测试中的主要测试对象和依赖easymock课程-单元测试中的主要测试对象和依赖????public?void?testQuery()?{
easymock课程-单元测试中的主要测试对象和依赖????????User?expectedUser?=?new?User();
easymock课程-单元测试中的主要测试对象和依赖????????expectedUser.setId("1001");
easymock课程-单元测试中的主要测试对象和依赖????????expectedUser.setAge(30);
easymock课程-单元测试中的主要测试对象和依赖????????expectedUser.setName("user-1001");
easymock课程-单元测试中的主要测试对象和依赖????????UserDao?userDao??=?EasyMock.createMock(UserDao.class);
easymock课程-单元测试中的主要测试对象和依赖????????EasyMock.expect(userDao.getById("1001")).andReturn(expectedUser);
easymock课程-单元测试中的主要测试对象和依赖????????EasyMock.replay(userDao);
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖????????UserServiceImpl??service?=?new?UserServiceImpl();
easymock课程-单元测试中的主要测试对象和依赖????????service.setUserDao(userDao);
easymock课程-单元测试中的主要测试对象和依赖????????User?user?=?service.query("1001");
easymock课程-单元测试中的主要测试对象和依赖????????assertNotNull(user);
easymock课程-单元测试中的主要测试对象和依赖????????assertEquals("1001",?user.getId());?
easymock课程-单元测试中的主要测试对象和依赖????????assertEquals(30,?user.getAge());?
easymock课程-单元测试中的主要测试对象和依赖????????assertEquals("user-1001",?user.getName());?
easymock课程-单元测试中的主要测试对象和依赖
easymock课程-单元测试中的主要测试对象和依赖????????EasyMock.verify(userDao);
easymock课程-单元测试中的主要测试对象和依赖????}
easymock课程-单元测试中的主要测试对象和依赖}

?

??? 在这个测试类中,主要测试对象就是UserServiceImpl,对于UserServiceImpl的依赖UserDao,我们采取mock这个UserDao来满足UserServiceImpl的测试需要。

?

?2. UserDaoImplTest

???? 代码示例就不详细写了,和上面的类似,主要测试对象就是UserDaoImpl, 我们将通过mock Datasource来满足UserDaoImpl对datasource的测试需要。

???? 可以从上面的例子中简单的看出,通常单元测试都遵循这样的惯例: AClass的单元测试类命名为AclassTest,主要职责是测试AClass的行为,理所当然的主要测试对象就是AClass。而所有被AClass的依赖则自然而然的成为次要测试对象,通常我们都不关注这些依赖的内部实现,也不会要求在AClass的单元测试案例中对这些依赖的实现进行测试和验证。

???? 这也符合单元测试的理念: 我们将类AClass定义为单元,测试这个单元的行为是否如预期。同时也符合UserServiceImpl的实现逻辑:UserServiceImpl依赖到UserDao接口,并不直接依赖到UserDaoImpl,因此在UserServiceImpl的单元测试中,也不应该引入UserDaoImpl这样的真实类,mock框架在这个时候是最适合出场表演的了:我们可以通过mock UserDao来模拟出UserDao的各种行为以便检测UserServiceImpl在这些行为下的处理是否正确: 不同的返回值,错误场景,异常场景。这也是mock框架在单元测试中被广泛使用的原因:还有什么比mock 类更能方便的做到这些?

?

?

你好,我最近在看easyMock3.0的。一开始跑一个测试servlet的例子没跑起来,看了下文档是少cglib和objenesis这两个jar,down下来后又跑了下,结果提示是找不到方法:NoSuchMethodError:org.objectweb.asm.***这些,难道还有依赖?我加了asm.jar也没成功,这相当于环境也没搭起来吧。不知道为什么,希望能得到帮助,谢谢! 2 楼 sword319 2011-03-11   得去下最新的asm.jar才可以.
楼主可以说说replay和verify是什么意思吗? 3 楼 skydream 2011-03-11   to sword319: replay和verify请参考教程中的此文“easymock教程-record-replay-verify模型”,地址为

http://skydream.iteye.com/blog/829338

有详细介绍,希望能帮到你。

热点排行