Mock object creation by example?

J

John J. Lee

I had the bright idea a week or two ago to construct mock objects (for
unit testing) "by example" by calling methods on a generic mock
object.

Say we have a class Bar, and we want to check that, when we use
BarUser in a particular way, BarUser first calls method Bar.xyzzy with
args "foo" and bar=2, then method Bar.do_nothing.

# first, construct a mock object by example:
m = Mock()
m.xyzzy("foo", bar=2)
m.do_nothing()

# then run the test
m.start_test()
bu = BarUser(m)
bu.method_a("foo", 1, bar=2)
bu.method_b()


That's it, essentially.

It does needs a bit more complication than that to be useful. For
example, a way specifying return values and exceptions to be expected,
a way of asking it to pretend to be a class object, ways of making
slightly fuzzy the expected number and order of calls and their
arguments, and the ability to easily inherit from Mock and override
methods etc. For example, you might say:

m.return_something().returns(1)
m.raise_something().raises(Exception)


Of course, it turns out somebody else thought of it first. For
example, in Java:

http://www.abstrakt.de/mockcreator.html


Anybody know if something like this already exists in Python?

Actually, looking at the examples on mockcreator's web page does lead
give you the suspicion that they've had some contact with a certain
language <wink>:

// setup of MockObjects
MockFoo mockFoo = new MockFoo();
mockFoo.expectDoSomething( "nobody expects", "the spanish inquisition" );

// Testcode
assertEquals( "the spanish inquisition", mockFoo.doSomething( "nobodyExpects" ) );

// Verify
mockFoo.verify();


John
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top