Jay Fields
Posts: 765
Nickname: jayfields
Registered: Sep, 2006
|
Jay Fields is a software developer for ThoughtWorks
|
|
|
|
Mockito non-hamcrest any matcher
|
Posted: Jun 8, 2009 5:45 PM
|
|
|
This post originated from an RSS feed registered with Ruby Buzz
by Jay Fields.
|
Original Post: Mockito non-hamcrest any matcher
Feed Title: Jay Fields Thoughts
Feed URL: http://blog.jayfields.com/rss.xml
Feed Description: Thoughts on Software Development
|
Latest Ruby Buzz Posts
Latest Ruby Buzz Posts by Jay Fields
Latest Posts From Jay Fields Thoughts
|
|
These days I'm using Mockito for my behavior based tests. I like Mockito's integration with Hamcrest, but I don't always like the viral matcher requirement. In particular, if I have a method that takes 3 arguments, I don't like the fact that if I use a matcher for one argument I have to use a matcher for all 3. For example, in the following verification I don't care about the callback instance, but I do care about the timeout and the async flag.
verify(channel).subscribe(any(Callback.class), eq(100), eq(true)) I was toying with some code the other day and it occurred to me that I should be able to write my own any method that achieves what I'm looking for without requiring my other arguments to be matchers.
The code below is what I've started using as an alternative.
public static T any(final Class clazz) { MethodInterceptor advice = new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { if (method.getName().equals("equals")) { return clazz.isInstance(obj); } return null; } };
return new ProxyCreator().imposterise(advice, clazz); } Using my any implementation the first example code can be written like the example below.
verify(channel).subscribe(any(Callback.class), 100, true) My implementation relies on classes from cglib and spruice; however, you could copy the necessary class from spruice very easily. Here are the referenced classes:- net.sf.cglib.proxy.MethodInterceptor
- net.sf.cglib.proxy.MethodProxy
- org.spruice.proxy.ProxyCreator
There may be limitations of this implemenation, but it's been working fine for me. Please let me know if you spot a potential improvement.
Read: Mockito non-hamcrest any matcher
|
|