Duck-Typing all java classes with JRuby, not just interfaces
------------------------------------------------------------

                 Key: JRUBY-3348
                 URL: http://jira.codehaus.org/browse/JRUBY-3348
             Project: JRuby
          Issue Type: Wish
          Components: Java Integration
            Reporter: Kaspar Schiess
         Attachments: impostor.tgz

I was told to post this as a jira issue as well: This post introduces a 
duck-typing extension for JRuby, extending the possibilities for duck-typing 
involving java classes. A working prototype is ready for download. Request for 
comments.

Hi all,

When testing java code (jruby, rspec), I frequently want to test code that 
takes some argument that I want to mock. If the code looks like this

  public void method1(ISomeInterface param) { ... }

everything is fine. If it looks like this

  public void method2(AClassThatIsReallyHeavyToConstruct param) { ... }

I am in trouble. JRuby doesn't allow me to cloak my ruby classes as java 
classes (duck-typing), only as java interfaces. Sometimes you can inherit from 
the class that you want to mock, but as hinted at by the example, this class is 
really to fat to construct and let's assume that I can't.

So I hacked together a small prototype [3] that allows me to do exactly that, 
using code I've found in jMock 2. The code allows you to

  ruby_mock = flexmock(:some_mock) # or whatever
  java_mock = DuckType::INSTANCE.transmogrify(ruby_mock,
    AClassThatIsReallyHeavyToConstruct.java_class)

yielding a java class instance that looks exactly like a descendant of 
AClassThatIsReallyHeavyToConstruct to the JVM, except that it's not. The 
instance that you get is a proxy class instance that forwards all calls to the 
ruby_mock object.

This obviously solves my problem and I can continue to test. But it is a 
kludge; I would really like JRuby to do all this work for me. How about merging 
this into JRuby? [1] This looks like a nice addition for the java integration 
to me. [2]

I don't know the JRuby code base well enough to integrate this on my own. I am 
working on it though - and perhaps someone might be willing to help me with 
this?

kaspar

[1] Please disregard the bad state of the java code involved. Especially that 
singleton-pattern is probably out of place. But I hope that you can  look at 
the essence and not at the form. (Which would have to be changed in case of a 
JRuby integration)

[2] As far as possible, I've made sure that the original authors are credited. 
I took the jMock ClassImpostorizer and special-purposed it. I am also in 
contact with the author of the code - he is ok with this new use.

[3] You can fetch the code from http://absurd.li/system/posts/impostor.tgz. 
You'll need rspec and possibly some other common stuff installed to be able to 
run the specs. If you use this for your own projects, don't forget to include 
the .jars in the ./lib dir.





-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to