锁定老帖子 主题:用模板简化EasyMockTest
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-31
/** * 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帖子的启发 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-01-31
脚着比俺的@Mock难用多了。
|
|
返回顶楼 | |
发表时间:2008-01-31
用了 @Mock以后的确 代码更简洁了。
完全把不相干的东西剥离出去了。 太棒了! |
|
返回顶楼 | |
发表时间:2008-01-31
改动了一下,已经和ajoo的很相似了...。
|
|
返回顶楼 | |
发表时间:2008-01-31
要是我,肯定把@Mock写在同一行里:
@Mock Foo foo; 多占一行明显看着不舒服。 |
|
返回顶楼 | |
发表时间:2008-01-31
ajoo 写道 要是我,肯定把@Mock写在同一行里:
@Mock Foo foo; 多占一行明显看着不舒服。 幸亏不是你review 我工作的代码... |
|
返回顶楼 | |
发表时间:2008-02-01
jomper 写道 ajoo 写道 要是我,肯定把@Mock写在同一行里:
@Mock Foo foo; 多占一行明显看着不舒服。 幸亏不是你review 我工作的代码... 呵呵。也幸亏我不用看这个代码。感觉会很痛苦地。 |
|
返回顶楼 | |
发表时间:2008-02-01
太刻薄了. - -!
|
|
返回顶楼 | |
发表时间:2008-02-01
jomper 写道 太刻薄了. - -!
不是刻薄吧?程序风格问题有不同意见很正常吧?要是这你也觉得刻薄,还是别让人review代码了。 |
|
返回顶楼 | |
发表时间:2008-02-02
精雕细凿了一下.
|
|
返回顶楼 | |