`
jomper
  • 浏览: 37382 次
  • 性别: Icon_minigender_1
  • 来自: 湖北-武汉
社区版块
存档分类
最新评论

用模板简化EasyMockTest

    博客分类:
  • Java
阅读更多
mock template
/**
 * mock template
 * @author Jomper
 *
 */
public abstract class MockTemplate {
	private Object[] mocks;

	@Before
	public void setUp() throws Exception{
		mockFields(getClass(), this);
		expectAll();
	}

	@Test
	public void test() {
		replay(mocks);
		process();
		verify(mocks);
	}

	/**
	 * reflect itself get annotate fields that dynamic assigned to mock objects
	 * @param clazz
	 * @param test
	 * @throws Exception
	 */
	private void mockFields(Class<?> clazz, Object test) throws Exception {
		List<Object> _mocks = new ArrayList<Object>();
		for (Field field : clazz.getDeclaredFields()) {
			if (field.getAnnotation(Mock.class) != null) {
				try {
					field.setAccessible(true);
					Object o = createMock(field.getType());
					field.set(test, o);
					_mocks.add(o);
				} catch (IllegalArgumentException e) {
					throw new Exception(e.getMessage(),e);
				}
			}
		}
		mocks = _mocks.toArray();
	}

	public abstract void process();

	public abstract void expectAll();
}


测试模型:
/**
 * Response interface
 * @author Jomper
 *
 */
public interface Response {
	/**
	 * request handler
	 * @param request
	 * @return result
	 */
	public Object getResult(Request request);
}

/**
 * Request interface
 * @author Jomper
 *
 */
public interface Request {
	/**
	 * set request content
	 * @param o
	 */
	public void setRequest(Object o);
}

/**
 * Service sample
 * @author Jomper
 * 
 */
public class Service {
	/**
	 * you can do something before get result
	 * initial response result and filter special characters from request content
	 * @param request
	 * @param response
	 * @return
	 */
	public Object execute(Request request, Response response) {
		//TODO something before get result
		return response.getResult(request);
	}
}


测试实例
/**
 * service test
 * @author Jomper
 *
 */
public class ServiceTest extends MockTemplate {
	@Mock private Request request;
	@Mock private Response response;
	private Service service;
	
	@Before
	public void before() throws Exception{
		service = new Service();
	}

	public void expectAll() throws Exception{
		request.setRequest("a cup of tea");
		request.setRequest("coffee");
		expect(response.getResult(request)).andReturn("Sorry").andReturn("OK");
	}

	/**
	 * if request.setRequest("a cup of tea"),response.getResult(request) return "Sorry"
	 * else return "OK"
	 */
	public void process() throws Exception{
		request.setRequest("a cup of tea");
		assertTrue("Sorry".equals(service.execute(request, response)));
		
		request.setRequest("coffee");
		assertTrue("OK".equals(service.execute(request, response)));
	}
}


这个是受了ajoo帖子的启发

分享到:
评论
13 楼 zdonking 2008-02-05  
恩。这个expectAll设计的有问题,如果只是在基类里只是暴露个的expect方法,方便test使用就可以了。
12 楼 ajoo 2008-02-03  
zdonking 写道
不在test里 显式的expect,replay,感觉别扭。可能是习惯了正常方式。

主要是,难道一个test class只能有一个expectation?只能有一个test case?
11 楼 joachimz 2008-02-03  
粗看一眼,与fest mock比较象!
http://fest.easytesting.org/
10 楼 zdonking 2008-02-03  
不在test里 显式的expect,replay,感觉别扭。可能是习惯了正常方式。
9 楼 jomper 2008-02-02  
精雕细凿了一下.
8 楼 ajoo 2008-02-01  
jomper 写道
太刻薄了. - -!

不是刻薄吧?程序风格问题有不同意见很正常吧?要是这你也觉得刻薄,还是别让人review代码了。
7 楼 jomper 2008-02-01  
太刻薄了. - -!
6 楼 ajoo 2008-02-01  
jomper 写道
ajoo 写道
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

多占一行明显看着不舒服。

幸亏不是你review 我工作的代码...

呵呵。也幸亏我不用看这个代码。感觉会很痛苦地。
5 楼 jomper 2008-01-31  
ajoo 写道
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

多占一行明显看着不舒服。

幸亏不是你review 我工作的代码...
4 楼 ajoo 2008-01-31  
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

多占一行明显看着不舒服。
3 楼 jomper 2008-01-31  
改动了一下,已经和ajoo的很相似了...。
2 楼 jomper 2008-01-31  
用了 @Mock以后的确 代码更简洁了。

完全把不相干的东西剥离出去了。

太棒了!
1 楼 ajoo 2008-01-31  
脚着比俺的@Mock难用多了。

相关推荐

Global site tag (gtag.js) - Google Analytics