Mock object creation by example?

John J. Lee jjl at pobox.com
Wed Jul 9 01:27:00 CEST 2003


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




More information about the Python-list mailing list