Wednesday, September 23, 2009

jmock2.5 使用总结

更多精彩请到 http://www.139ya.com

jmock是写单元测试时需要生成mock对象时很好的辅助库。

软件地址: http://www.jmock.org

本文是我今天摸索使用jmock(v2.4)的总结。不是初学指南,当你入门了,我想可以作为简单手册。是原版文档补充。

一般使用模式:
生成Mockery对象,可以全局共享
Java代码
  1. Mockery context = new JUnit4Mockery() {
  2. {
  3. //声明针对类mock(采用cglib生成子类),final方法无法mock,针对接口则会采用动态代理,不需要声明下面的代码
  4. setImposteriser(ClassImposteriser.INSTANCE);
  5. }
  6. };


例子
Java代码
  1. final UserDAO dao = context.mock(UserDAO.class);
  2. final Integer id1 = 1;
  3. final User user1 = new User();
  4. user1.setId(1);
  5. user1.setUserId(1);
  6. user1.setName("1");
  7. final Integer id2 = 2;
  8. final User user2 = new User();
  9. user2.setId(2);
  10. user2.setUserId(2);
  11. user2.setName("2");
  12. context.checking(new Expectations(){
  13. {
  14. //one表示调用一次。
  15. one(dao).find(id1);will(returnValue(user1));
  16. //再用另一参数做一次mock
  17. one(dao).find(id2);will(returnValue(user2));
  18. //可以忽略mock对象
  19. //ignoring(dao);
  20. }
  21. });

context.checking(new Expectations(){中的语法总结

1.
Java代码
  1. context.checking(new Expectations(){
  2. {
  3. //另一种连续调用: 同个方法同样参数,调用多次返回值各不同,声明了调用次序
  4. atLeast(1).of(dao).find(id1);
  5. will(onConsecutiveCalls(
  6. returnValue(user1),
  7. returnValue(user2)));
  8. }
  9. });

2.
Java代码
  1. context.checking(new Expectations(){
  2. {
  3. allowing(dao).find(id);will(throwException(new FindException()));//也可以throw RuntimeException
  4. }
  5. });

3.
Java代码
  1. {
  2. //allowing不限定调用次数
  3. allowing(dao).find(id);will(returnValue(user));
  4. never(dao).findByUserId(userId);
  5. //下面两行是从jmock官网copy下来的,可以为相同的方法用不同的参数mock多次
  6. //one(calculator).load("x"); will(returnValue(10));
  7. //never(calculator).load("y");
  8. }
  9. });

4.
Java代码
  1. context.checking(new Expectations(){
  2. {
  3. //可以在mock方法时做一些参数操作
  4. allowing(srv).findUser(with(lessThan(10)));will(returnValue(user1));
  5. allowing(srv).findUser(with(greaterThan(10)));will(returnValue(user2));
  6. }
  7. });

5.
Java代码
  1. context.checking(new Expectations(){
  2. {
  3. //inSequence(sequence),会把声明的方法放进序列,调用次序必须符合声明次序
  4. one(dao).find(id1);will(returnValue(user1));inSequence(sequence);
  5. one(dao).find(id2);will(returnValue(user2));inSequence(sequence);
  6. }
  7. });
  8. //调用次序必须符合声明次序
  9. assertEquals(user1,dao.find(id1));
  10. assertEquals(user2,dao.find(id2));

No comments: