Tuesday, March 29, 2011

Mock Mock Mock

Mocking is serious business for evolved coding monkeys these days. There are few good frameworks which help in mocking like easymock, jMockit, mockrunner etc

PowerMock
SmartGWT is a GWT widget library which has design issues as its classes doesnt mostly implement interfaces. But the problem is we have to use it as it has nice widgets.

Question: how do we unit test these classes which have native code and hard to mock?
 Powermock came to rescue us. It can re-engineer the class and supress static block and method.
Eg:
@RunWith(PowerMockRunner.class)
@PrepareForTest( {Appender.class})
@SuppressStaticInitializationFor({"com.google.gwt.user.client.ui.UIObject","com.smartgwt.client.widgets.BaseWidget"})
@MockPolicy({Slf4jMockPolicy.class, Log4jMockPolicy.class})
public class MyStaticTest{
}
The above supresses static blocks which have wierd native calls and helps us continue our junit as usual. But its a bit slow (worth it i believe).
More on usage here



jMock vs. EasyMock

Comparison of jmock & easy mock

Both have similar features. jMock has a DSL (domain specific language) while easy mock has record-replay style.

Apparently jMock seems to be better in terms of readability and usability. Would prefer the more intuitive framework like jMock than Easy mock.

Will post more when I actually try using jMock. Till than easy mock.

Useful links
1. EasyMock http://www.easymock.org
2. JMock  http://www.jmock.org
3. Mackinnon, T., et al. 2000. Endo-Testing: Unit Testing with Mock Objects. In Proceedings of XP 2000. http://www.mockobjects.com/files/endotesting.pdf
4. Freeman, S., et al. 2004. Mock Roles, not Objects. In Proceedings of OOPLSA 2004. http://www.mockobjects.com/files/mockrolesnotobjects.pdf
5. Walls, C. 2008. Spring in Action, 2nd Edition. Manning Publications Co., Greenwich, CT. §B.2.1.
6. Stewart, S. 2004. Approaches to Mocking. http://www.onjava.com/lpt/a/4526
7. Fowler, M. 2007. Mocks Aren't Stubs. http://martinfowler.com/articles/mocksArentStubs.html




No comments: