Question

I'm new to Groovy (and to JMock too for that matter) and having some trouble building expectations that use matchers on the parameters of the methods being mocked. When I try to do something like this:

    Expectations e = new Expectations();
    e.allowing(mockObject).doSomething(Expectations.with(aNonNull(ImmutableCollection.class)))
    e.will(returnValue(someResponse))

It causes the following error when building the expectation:

groovy.lang.MissingMethodException: No signature of method: static org.jmock.Expectations.with() is applicable for argument types: (org.hamcrest.core.IsNot) values: [not null]
Possible solutions: with(boolean), with(org.hamcrest.Matcher), with(byte), with(org.hamcrest.Matcher), with(char), with(org.hamcrest.Matcher)

aNonNull returns Matcher<T> (org.hamcrest.core.IsNot implements Matcher<T>) and there is an Expectations.with method that takes a Matcher so I'm not sure why Groovy is trying to find a version of with that takes the concrete class rather than the interface specified by aNonNull. I've also tried casting the return value of aNonNull to both Matcher and Matcher<T> without any change in the error. I'm not sure if there's something about the generics that's confusing Groovy or what else to check.

Was it helpful?

Solution

According to the JavaDoc, org.jmock.Expectations.with() is an instance rather than a static method. That's why you get an error.

By the way, testing/mocking frameworks built specifically for Groovy will make your life a lot easier (even when testing Java code). For example, the same expectation looks like this in Spock (http://spockframework.org):

mockObject.doSomething(_ as ImmutableCollection) >> someResponse

Another Groovy mocking framework to be aware of is GMock (http://code.google.com/p/gmock/).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top