That's a good one. Thanks a lot.
It would work great if you could "hint" to OpenEJB a "LocalClient".
This way the user doesn't have to @LocalClient his EJBs, and the
Runner can hint to OpenEJB which objects to do it for.
To modify the existing runner into using @LocalClient instead, VERY
easy. Just do the following:
1. In the OpenEjbRunner.java file, replace the configureTest(Class
testObj) method with the following:
protected void configureTest(Object testObj) throws Exception
{
initialContext.bind("inject", testObj);
}
2. Annotate your test class with @LocalClient.
For interest sake, did the attachment go through?
Quintin Beukes
On Wed, Sep 23, 2009 at 2:35 PM, Laird Nelson <[email protected]> wrote:
> Neat stuff.
>
> Incidentally, OpenEJB will handle the injection for you:
> http://openejb.apache.org/3.0/local-client-injection.html
>
> Cheers,
> Laird
>
> On Wed, Sep 23, 2009 at 8:29 AM, Quintin Beukes <[email protected]> wrote:
>
>> Hey,
>>
>> I know this was mentioned the other day, though I can't find the
>> e-mail, so I'm making a new thread. I attached a simple runner which I
>> made as a personal PoC. It basically allows you to define a test as
>> follows:
>>
>> @RunWith(OpenEjbRunner.class)
>> @TestContext
>> public class BasicStatelessBeanTest
>> {
>> �...@ejb
>> public BasicStatelessBeanLocal basicStatelessBean;
>>
>> �...@resource
>> public InitialContext initialContext;
>>
>> �...@test
>> public void testSomeMethod() {}
>> }
>>
>> It then runs the test and injects any @EJB annotated fields, and any
>> InitialContext type fields when they're annotated with @Resource.
>>
>> It's very very basic though. Took me probably about 30 minutes to put
>> it together. The injection is a JNDI brute force method, where it
>> tries different combinations of names, depending on the annotation
>> arguments and field type. Further you can supply a properties resource
>> filename to @TestContext for customized InitialContext initialization.
>> It also only supports Local initial context (UNLESS you specify
>> mappedName in each @EJB annotation).
>>
>> Note that the test runner should initialize the InitialContext for
>> JUnit 3 tests (tests extending "TestCase"), though it won't do any
>> injection, so it's pretty useless. I have yet to figure out how the
>> Runner works for JUnit 3 tests. Once I'm able to intercept the test
>> class instance the rest should be easy.
>>
>> None of the above limitations is hard to fix, and I'm definitely going
>> to do them. Like I said, this is my result after playing with it for
>> about half an hour.
>>
>> Further, I'm using reflection to do the injection, so the fields need
>> to be public.
>>
>> Well, I'm using this way from now on. Our tests are already strapped
>> with a small framework I made, which wraps OpenEJB and is configured
>> through Spring, so it allows you to customize your lookups nicely,
>> even overriding certain EJB lookups with spring beans. If anyone wants
>> some more of this, just let me know and I'll send it along. I'll be
>> evolving the for our own purposes, and if there's any interest I'm
>> willing to send updates.
>>
>> Note that whatever I send is licensed under Apache 2.0, so you're free
>> to use it in whichever way the license allows.
>>
>> Attached is the maven project for the runner. It contains tests to
>> demonstrate it's use. If the attachment was rejected by the mailing
>> list, just reply and I'll find another way to distribute it.
>>
>> Quintin Beukes
>>
>