Java Mailing List Archive

http://www.gg3721.com/

Home » user.jmock »

[jmock-user] Re: Re: Tested object in an Expectation section

Mac

2008-06-22

Replies: Find Java Web Hosting

Author LoginPost Reply
Thanks for replying.

I dont want to use jmock for unit testing. It will be something more -
testing accordance with documentation (UML sequence diagrams) in
communication between objects. I would like to test in isolation one object
for example Sender, his communication with Receiver.

And my main question is if it is possible to change jmock lib this way to
allow putting testing object in expectation section. This library has a lot
of functionality which I need and I dont want to write my own library from
scratch.


> I'm not really sure what you're trying to test.
>
> There's no point in testing that the receiver calls the sender's ack
> method, because the receiver is a mock object and does whatever the
> test tells it to do.
>
> If you want to test that a *real* receiver calls ack on a sender, then
> you'll need to use a mock sender when you test the implementation of
> receiver.
>
> --Nat
>
>
> 2008/6/21 Mac <maciek.kepinski@(protected)>:
> >>I'm sorry, but that doesn't really make sense. There should be no way
> >>for
> >>receiver1 to receive an event before the triggering ack(). I'm sure
> >>there's another way, but we need to understand your >code better. Can
> >>you
> >>give us more detail?
> >>
> >>S.
> >
> > So here is simple example:
> >
> > I have two classes Sender and Receiver. They have references to each
> > other
> > (Sender has reference to Receiver and vice versa).
> > And now Sender will "send" message to Receiver using Receiver's recv()
> > method. After that Receiver is calling ack() method on
> > Sender to acknowledge transmission. So now I want to prepare
> > Expectations
> > section like this:
> >
> > one (receiverMock1).recv("a"); inSequence(SenderSequence); //mock object
> > one (senderTest).ack("a"); inSequence(SenderSequence); //tested object
> >
> > Here I am testing Sender class. I know I can create action and it should
> > look something like this:
> >
> > one (receiverMock1).recv("a"); inSequence(SenderSequence);
> > will(callAckMethod(senderTest,"a"));
> >
> > but next I am not testing calling ack() method in the sequence.
> >
> > Here is whole code:
> >
> > Unit test:
> > ///////////////////////
> > package case1.test;
> >
> > import junit.framework.TestCase;
> >
> > import org.jmock.Expectations;
> > import org.jmock.Mockery;
> > import org.jmock.Sequence;
> > import org.jmock.api.Action;
> > import org.jmock.lib.legacy.ClassImposteriser;
> >
> > import case1.Receiver;
> > import case1.Sender;
> > import case1.action.CallBackAction;
> >
> > public class SequenceAckTest extends TestCase {
> > public static Action callAckMethod(Sender sender, String msg) {
> > return new CallBackAction(sender,msg);
> > }
> >
> > public void testSender() {
> > // set up
> > Mockery context = new Mockery() {{
> > setImposteriser(ClassImposteriser.INSTANCE);
> > }};
> >
> > //neighbors
> > final Receiver receiverMock1 = context.mock(Receiver.class,
> > "receiver1");
> >
> > // test object initialization
> > Sender senderTest = new Sender(receiverMock1);
> >
> > final Sequence SenderSequence = context.sequence("SenderSequence");
> >
> > // expectations
> > context.checking(new Expectations() {{
> > one (receiverMock1).recv("a"); inSequence(SenderSequence);
> > //will(callAckMethod(senderTest,"a"));
> > one (senderTest).ack("a"); inSequence(SenderSequence); //ERROR this will
> > not compile
> > }});
> >
> > // execute - start testing
> > senderTest.protocol();
> >
> > context.assertIsSatisfied();
> > }
> > }
> > ///////////////////////
> > Sender:
> > ///////////////////////
> > package case1;
> >
> > public class Sender{
> > private Receiver receiver1;
> >
> > private void sendMessageA(){
> > receiver1.recv("a");
> > }
> >
> > public Sender(Receiver rec1){
> > this.receiver1=rec1;
> > }
> >
> > public void protocol(){
> > //sending message
> > sendMessageA();
> > }
> >
> > public void ack(String msg){
> > System.out.println("Ack received: "+msg);
> > }
> > }
> > ///////////////////////
> > Receiver:
> > ///////////////////////
> > package case1;
> >
> > public class Receiver {
> > private Sender sender;
> >
> > public Receiver(Sender sender){
> > this.sender=sender;
> > }
> >
> > public void recv(String msg){
> > System.out.println("Receiver: "+msg);
> > sender.ack(msg);
> > }
> > }
> > ///////////////////////
> >
> > Thanks for replying.
> >
> > Regards,
> > Mac
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe from this list, please visit:
> >
> > http://xircles.codehaus.org/manage_email
> >
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
> http://xircles.codehaus.org/manage_email
>
>
>



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

  http://xircles.codehaus.org/manage_email


©2008 gg3721.com - Jax Systems, LLC, U.S.A.