Test::Mock::Recorder
In xUnit Test Patterns, Gerard Meszaros introduce the term "Test Double" and he lists various kinds of double: dummy object, fake object, stub, spy, and mock. You can read the summary at Martin Folwer's Bliki.
Last year I wrote own mock library for Perl. We can use Test::MockObject as (Gerard's definition of) mock. But it's hard. So my library provides "record-and-verify" style interface like Mox or Mocha.
However I gave a bad name "Test::Double". It's unfocused. So today I've renamed it to Test::Mock::Recorder.
Example
I wrote a small test for KeyedMutex::Memcached. Test::Mock::Recorder verifies the arguments and the order of invocations.
use strict;
use warnings;
use Test::More;
use Test::Mock::Recorder;
use_ok 'KeyedMutex::Memcached';
my $rec = Test::Mock::Recorder->new;
$rec->expects('add')->with('km:online:123', 1, 30)->returns(0);
$rec->expects('add')->with('km:online:123', 1, 30)->returns(1);
$rec->expects('delete')->with('km:online:123');
$rec->verify_ok(
sub {
my $km = KeyedMutex::Memcached->new(
cache => shift
);
$km->lock('online:123');
$km->release;
}
);
done_testing;
Test::Mock::Recorder provides a shortcut. If you don't have to test the arguments here, you can write like so:
...
my $rec = Test::Mock::Recorder->new;
$rec->expects(
add => 0,
add => 1,
delete => 1,
);
$rec->verify_ok(
...
If you have a comment or a question, please email, blog, fork or tweet to me (@kzys).