JUnit/Mockito实现单元测试

单元测试是分层测试理念中一个重要的环节,重点在于保证较小范围内某个功能模块的功能正常。

一般一个重要的测试类对应于一个单元测试(UT,unit testing),其中一个单元测试又包含正常和异常流程。

由于单元测试重点关注的是模块的功能实现,所以关联和依赖的其他服务可以被虚拟掉(mock),从而提高测试的精准性和速度。

在以java/spring为主的框架中,junit和mockito是常用的单元测试工具。

待测试的接口实现:

public class ToBeTestedServicezImpl implements ToBeTestedService {

	protected DataBaseDAO dataBaseDAO;

	protected FunctionSwitch functionSwitch;

	@Override
	public String returnString() {
		return "a string";
	}

	@Override
	public Object returnObject() {

		functionSwitch.setAvaiable(true);

		Object queriedData = null;
		try {
			queriedData = dataBaseDAO.readData("select * from test db;");
		} catch (SQLException e) {
			return new Result(false, "DB error.", null);
		}

		return new Result(true, "Switch turned on and queried successed.",
				queriedData);
	}

}


单元测试类:

<pre name="code" class="java">public class ToBeTestedServiceUnitTest {

	protected FunctionSwitch functionSwitch;

	protected DataBaseDAO dataBaseDAO;

	protected ToBeTestedService toBeTestedService;

	@Before
	public void init() {

		functionSwitch = mock(FunctionSwitch.class);

		dataBaseDAO = mock(DataBaseDAO.class);

		toBeTestedService = new ToBeTestedServicezImpl();
		((ToBeTestedServicezImpl) toBeTestedService)
				.setDataBaseDAO(dataBaseDAO);
		((ToBeTestedServicezImpl) toBeTestedService)
				.setFunctionSwitch(functionSwitch);

	}

	@Test
	public void testReturnString() {
		try {
			when(dataBaseDAO.readData(any(String.class))).thenReturn("a");

			String result = toBeTestedService.returnString();

			Assert.assertNotNull(result);

			Assert.assertEquals("a string", result);

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testReturnObject() {
		try {
			when(dataBaseDAO.readData(any(String.class))).thenReturn("a");

			Object result = toBeTestedService.returnObject();

			Assert.assertNotNull(result);

			Assert.assertEquals("a", ((Result) result).getData());

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Test
	public void testReturnObjectNull() {
		try {
			when(dataBaseDAO.readData(any(String.class))).thenReturn(null);

			Object result = toBeTestedService.returnObject();

			Assert.assertNotNull(result);

			Assert.assertEquals(null, ((Result) result).getData());

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}


 说明: 

1.在测试类中首先要定义依赖的服务和待测试的服务。

2.将待测服务实例化。

3.依赖的服务使用mockito mock掉。(为方便地使用mockito提供的方法,将mockito静态引入,可以大量减少包名的引入。)

4.执行服务调用并断言。进行服务的判断。包括正常和异常流程。

感想:

1.单元测试的过程其实是一个严格的CR(code review)的过程,很多问题都可以在单元测试的过程中发现。

2.尽量由开发人员交叉完成。

3.是提高代码稳定性和系统覆盖率的有效方式。

4.持续集成的单元测试能够快速发现代码改动,并评估影响范围。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值