« Return to Thread: Mocking a Concrete class with JMock

Re: Mocking a Concrete class with JMock

by Nat Pryce :: Rate this Message:

Reply to Author | View in Thread

2009/4/12 T P D <lists@...>:
>  // expectations
>  context.checking(new Expectations() {{
>     oneOf (c).bar(s); // exception gets thrown from here
>  }});
...
> Unfortunately, Concrete.bar in turn calls a method that throws. That method
> is final, so I can't override it.

If you've mocked out Concrete.bar, it doesn't matter what the real
implementation calls.  The mock object will not be calling it.

> Further, even if I comment out the line
> new ClassUnderTest.foo( c, s );, the exception is thrown when JMock sets up
> exceptions, not when foo is called.

Is 'bar' final?

> So how can I test that method ClassUnderTest.foo does forward to
> Concrete.bar?

Define an interface between ClassUnderTest and Concrete that describes
the service that ClassUnderTest needs performed for it. You can mock
that interface in the unit test of ClassUnderTest.

Write a thin adapter object that maps the interface onto the Concrete
implementation.  You'll have to test that adapter without mock objects
or just rely on it being so simple that end-to-end test coverage will
give you confidence that it works. Adapters like this often do little
more than forward messages through, translating from the domain of
ClassUnderTest to the domain of Concrete, so the latter is usually
sufficient.

--Nat

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

    http://xircles.codehaus.org/manage_email


 « Return to Thread: Mocking a Concrete class with JMock