#!/usr/bin/python __author__ = "raphtee@google.com (Travis Miller)" import mock, mock_demo_MUT class MyError(Exception): pass class A(object): var = 8 def __init__(self): self.x = 0 def method1(self): self.x += 1 return self.x def method2(self, y): return y * self.x class B(A): def method3(self, z): return self.x + z def method4(self, z, w): return self.x * z + w class C(B): def method5(self): self.method1() t = self.method2(4) u = self.method3(t) return u class D(C): def method6(self, error): if error: raise MyError("woops") else: return 10 class E(D): def __init__(self, val): self.val = val # say we want to test that do_stuff is doing what we think it is doing def do_stuff(a, b, func): print b.method1() print b.method3(10) print func("how many") print a.method2(5) print b.method1() print b.method4(1, 4) print b.method2(3) print b.method2("hello") def do_more_stuff(d): print d.method6(False) try: d.method6(True) except: print "caught error" def main(): god = mock.mock_god() m1 = god.create_mock_class(A, "A") print m1.var m2 = god.create_mock_class(B, "B") f = god.create_mock_function("func") print dir(m1) print dir(m2) # sets up the "recording" m2.method1.expect_call().and_return(1) m2.method3.expect_call(10).and_return(10) f.expect_call("how many").and_return(42) m1.method2.expect_call(5).and_return(0) m2.method1.expect_call().and_return(2) m2.method4.expect_call(1, 4).and_return(6) m2.method2.expect_call(3).and_return(6) m2.method2.expect_call(mock.is_string_comparator()).and_return("foo") # check the recording order for func_call in god.recording: print func_call # once we start making calls into the methods we are in # playback mode do_stuff(m1, m2, f) # we can now check that playback succeeded god.check_playback() # now test the ability to mock out all methods of an object # except those under test c = C() god.mock_up(c, "c") # setup recording c.method1.expect_call() c.method2.expect_call(4).and_return(4) c.method3.expect_call(4).and_return(5) # perform the test answer = c.method5.run_original_function() # check playback print "answer = %s" % (answer) god.check_playback() # check exception returns too m3 = god.create_mock_class(D, "D") m3.method6.expect_call(False).and_return(10) m3.method6.expect_call(True).and_raises(MyError("woops")) do_more_stuff(m3) god.check_playback() # now check we can mock out a whole class (rather than just an instance) mockE = god.create_mock_class_obj(E, "E") oldE = mock_demo_MUT.E mock_demo_MUT.E = mockE m4 = mockE.expect_new(val=7) m4.method1.expect_call().and_return(1) mock_demo_MUT.do_create_stuff() god.check_playback() mock_demo_MUT.E = oldE if __name__ == "__main__": main()