EasyMock 单元测试

之前写单元测试的时候基本上没有借助任何工具,用的是最“土”的方法,造不同的数据然后对不同的分支进行覆盖,其实效率很低而且有些方法测试不到。这种方法还有另一个弊端就是当系统中需要和容器进行打交道时写单元测试就变得很费劲,要么就是启动一个容器(考虑使用jetty)要么就优化代码将使用容器得地方提取出来,但是这要求写代码的人有充分的自觉性(痴!心!妄!想!)。但是如果使用mock就能有效的避免这种尴尬局面。

核心代码如下,其中整个项目已经上传,需要的童鞋可以点击下载

UserServiceImplTest

package easyMock5.normalUse;

import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;

public class UserServiceImplTest {
	
	@Test
	public void testQuery(){
		User expectedUser=new User();
		expectedUser.setAge(30);
		expectedUser.setId("1001");
		expectedUser.setName("test");
		
		UserDao userDao=EasyMock.createMock(UserDao.class);
		EasyMock.expect(userDao.getById("1001")).andReturn(expectedUser);
		EasyMock.replay(userDao);
		
		UserServiceImpl service=new UserServiceImpl();
		service.setUserDao(userDao);
		User user=service.query("1001");
		Assert.assertNotNull(user);
		Assert.assertEquals(user.getId(), "1001");
		Assert.assertEquals(user.getAge(), 30);
		Assert.assertEquals(user.getName(), "test");
		
	}
}


虽然说贴代码是最苍白的表示方法,但是自己还是想就这苍白的代码说说自己的感受。单元测试顾名思义就是进行最小粒度的测试,如果每个部件都没有问题,那么整体有问题的可能性就会大大减小。

要测试零部件是否合格最好的做法就是将其至于真实的环境中去检测都否有异常。但是为了检测部件去制造真是环境成本是巨大的,也是不可能的。就像学生想知道自己的水平不一定非要去参加一次高考一样,大可以通过模拟考试来找到自己的不足,然后在真正的高考中去提升自己。

EasyMock和模拟考试是一个道理,通过模拟最真实的环境去发现被测试事物的不足。映射到EJB的单元测试当中就是在测试Service层的时候需要容器进行配合(这里指注入Dao层),或者测试Dao层的时候需要注入EntityManager。在这个过程中我们没必要启动容器进行测试,打可以模拟一个我们想要的对象帮助我们进行测试。

在上面的代码中就模拟出了一个我们所希望的Dao层的类,然后通过注入的方式放到Service中,进而对Service进行测试;就像高三时候的模拟考试一样,一切模拟和高考一模一样(除了考完不能上大学),然后对学生的水平进行评估。

人虽然只活一次(宗教当中的轮回不在本文的讨论之内),但是我们要做的事情大多数不可能只做一次,所以很多时候做一件事情尤其是第一次做的时候失败了,是好事!第一次相对第二次而言是演习,是铺垫,是模拟。就像单元测试中测试异常一样,出现可捕捉的异常是一件好事,因为只有这样才能暴露问题,然后确保下一次的成功。失败了不要沮丧反而应该高兴,(好变态的想法),因为这次的失败是下次成功的保障。

你可能感兴趣的:(EasyMock 单元测试)