Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Test::MockModule

use strict;
use warnings;

use ExtUtils::MakeMaker;

WriteMakefile(
    NAME         => 'MyGreeting',
    VERSION_FROM => 'lib/MyGreeting.pm',
    LICENSE      => 'perl',
    TEST_REQUIRES => {
        'Test::More'       => '0',
        'Test::MockModule' => '0',
    },
);
package MyGreeting;
use strict;
use warnings;

use MyGreeting::Provider ();

our $VERSION = '0.01';

sub greet {
    my ($class, $name) = @_;

    my $prefix = MyGreeting::Provider::get_greeting_prefix();
    return "$prefix $name";
}

1;
package MyGreeting::Provider;
use strict;
use warnings;

sub get_greeting_prefix {
    # pretend that it takes time maybe because it is an external call.
    sleep(3);
    return 'Hello';
}

1;
use strict;
use warnings;

use Test::More;
use Test::MockModule;

use MyGreeting;

is(
    MyGreeting->greet('Gabor'),
    'Hello Gabor',
    'real provider returns the default prefix',
);

my $provider = Test::MockModule->new('MyGreeting::Provider');
$provider->redefine(
    get_greeting_prefix => sub {
        return 'Good morning';
    }
);

is(
    MyGreeting->greet('Gabor'),
    'Good morning Gabor',
    'mocked provider changes the greeting',
);

done_testing;