jmock-developers / jmock-library

An expressive Mock Object library for Test Driven Development
http://www.jmock.org
BSD 3-Clause "New" or "Revised" License
133 stars 70 forks source link

JavaReflectionImposteriser and Scala #74

Open nargov opened 9 years ago

nargov commented 9 years ago

Hi,

I've been writing a small integration library between JMock and specs2, since we love JMock here at Wix, but we write mostly in Scala now. I encountered an issue where the JavaReflectionImposteriser would fail to create a mock from a Scala trait that contains a function that returns a Scala Set. It fails because the Imposteriser uses JDKs Proxy which is unable to create the instance. This is due to Set having two apply methods:

apply(T): Boolean

and

apply(T*:): CC[T]

Since Java ignores Scala's way of creating parameter lists, it things both methods have the same signature but with different return types.

I have worked around this by creating a new Imposteriser, which uses the JavaReflectionImposteriser, and if it fails because of that error, uses the ClassImposteriser instead.

I just thought you guys might find this interesting.

olibye commented 9 years ago

Thanks for the tip. If I understand you correctly you're, not raising an issue with JMock? I nearly always use the ClassImposteriser.

It looks like we should add your Specs2-JMock project as a link in our readme.

nargov commented 9 years ago

You're correct, this is more of an issue with Scala-Java interop, but I just thought it had some bearing here, perhaps for documentation purposes.

I do like that the JavaReflectionImposteriser is the default and that using the ClassImposteriser has to be a conscious decision, since it doesn't work on Classes, and reminds me that I should strive to use mocking on interfaces, rather than concrete classes.

And that would be great!