• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Tim Cooke
  • Ron McLeod
  • paul wheaton
  • Jeanne Boyarsky
Sheriffs:
  • Paul Clapham
  • Devaka Cooray
Saloon Keepers:
  • Tim Holloway
  • Roland Mueller
  • Himai Minh
Bartenders:

Junit testing on a stateless session bean

 
Ranch Hand
Posts: 82
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi I have everything working in my stateless session bean(SLSB) but unit testing is a bit awkward to say the least.

I have a SLSB that uses JMS to send messages and have several other methods in the bean. I wrote a quick Messgedriven bean to call the SLSB when i simply drop a text message onto a queue that the MDB is listening to and it also works great but this seems so overkill and I want to write a Junit to test my SLSB methods. The lookup continues to fail even though I call it exactly the same.

must I have to use mock ejb or something else besides a simple Junit?

has anyone ran into this issue? pleas help

thanks
 
author
Posts: 11962
5
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
David, the solution to this kind of problems is often to isolate the trouble and cut it loose.

In your case, try extracting the way your SLSB is getting hold of the JMS queue/topic into a protected method. Then, in your unit test override that specific method.

In other words, if this is what you have now:

Convert it to something like this:

The advantage now is that we can bypass the JNDI lookup in our test:

Now, we can write a simple FakeQueue class that implements the proper JMS interface but doesn't really do anything.
 
Ranch Hand
Posts: 775
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
There are a couple of variations on Lasse's idea that you can try, depending on the issues you are trying to deal with during testing.

1. If you don't want to create a mock implementation class or use one of the assorted tools that creates one for you, EasyMock can come in handy. Best for situations where you have an interface-based API to implement. It is a little indirect and can take a bit of getting used to, but nice for situations where you want methods to respond with different values based on arguments or how often you invoked the various methods, and you can optionally use it to verify that the implemented methods were actually used.

2. Instead of abstracting objects with big APIs into helper methods, you can create an abstraction based on returning purpose-specific values. For example, instead of a method returning a Queue you can return the string/map/etc. value you expected to get from a message obtained from a queue. Instead of your test class overriding to provide a mock implementation, it overrides to provide a more direct value. The "live" implementation does the usual work of having a connection factory establish a session and a message listener. Both the coarse-grained and the fine grained-approaches are workable, just depends on the specifics of what you are trying to do.
reply
    Bookmark Topic Watch Topic
  • New Topic