Let's pretend that you have a legacy report function, called "run_report()" (every company has one of those, don't they?).  Your customer wants it to send the report by email after it's done.

Surely you don't want to actually send a mail every time you run your tests, so you mock.

Presume you have a working "Email" class.  It has a "send_it" method that you need to mock.  Here's how you do it in various languages:

'''PerlLanguage''' (Using typeglobs, anonymous subs and Test::More)
 {
  my @args;
  local *Email::send_it = sub { @args = @_ };
  my $email = Email->new();
  run_report($email);
  is_deeply(\@args, [ $email, 'The report went like so...' ]);
 }

'''RubyLanguage''' (using RubyMock and RubyTestUnit)
 email = Mock.new()
 email.__next(:send_it) do |message|
  assert_equal('The report went like so...', message)
 end
 run_report(email)
 email.__verify

'''PythonLanguage''' (using PythonUnit)
 class Mock''''''Email(TestCase): # inherits from TestCase because assertions are not their own class
   def send_it(self, message):
     self.assertEqual(message, 'The report went like so...')
 email = Mock''''''Email()
 run_report(email)

'''PhpLanguage''' (using SimpleTest)
 Mock::generate("Email");    // Usually at top of test file
 $email = &new Mock''''''Email($this);
 $email->expectOnce("send_it", array('The report went like so...'));
 run_report($email);
 $email->tally();

----
These tests are doing different things: some fail as soon as an invalid message is sent (as MockObject''''''s should) while others store the message and test its validity after the fact.
----
I would really like to see the same thing in FORTRAN for my department, but their FortranCompiler has no interface at all to the Email''''''System.  It's so sad... --ChrisGarrod
----
CategoryInManyProgrammingLanguages