论坛首页 Java企业应用论坛

用模板简化EasyMockTest

浏览 4870 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-31  
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帖子的启发

   发表时间:2008-01-31  
脚着比俺的@Mock难用多了。
0 请登录后投票
   发表时间:2008-01-31  
用了 @Mock以后的确 代码更简洁了。

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

太棒了!
0 请登录后投票
   发表时间:2008-01-31  
改动了一下,已经和ajoo的很相似了...。
0 请登录后投票
   发表时间:2008-01-31  
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

多占一行明显看着不舒服。
0 请登录后投票
   发表时间:2008-01-31  
ajoo 写道
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

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

幸亏不是你review 我工作的代码...
0 请登录后投票
   发表时间:2008-02-01  
jomper 写道
ajoo 写道
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

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

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

呵呵。也幸亏我不用看这个代码。感觉会很痛苦地。
0 请登录后投票
   发表时间:2008-02-01  
太刻薄了. - -!
0 请登录后投票
   发表时间:2008-02-01  
jomper 写道
太刻薄了. - -!

不是刻薄吧?程序风格问题有不同意见很正常吧?要是这你也觉得刻薄,还是别让人review代码了。
0 请登录后投票
   发表时间:2008-02-02  
精雕细凿了一下.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics