Skip to content


Subversion checkout URL

You can clone with
Download ZIP
A mocking library for Erlang
Erlang Shell
Pull request Compare This branch is 2 commits ahead, 249 commits behind eproxus:master.
Failed to load latest commit information.
.scripts Uncomment dry run, document and clean up
doc Clean up copyright in edoc
src Added mocking helpers for working with eunit tests
test Refactor cover test
.gitignore Clean up ignores in doc/
.travis.yml Add R13B04 as a build target
CHANGELOG Add changelog for next version and tag helper script
Makefile Detect local rebar as fallback
NOTICE Update copyright
rebar.config Replace fail_on_warning with warnings_as_errors

Build Status


A mocking library for Erlang.


With meck you can easily mock modules in Erlang. You can also perform some basic validations on the mocked modules, such as making sure no unexpected exceptions occurred or looking at the call history.


  • Automatic renaming and restoration of original modules
  • Automatic backup and restore of cover data
  • Changing return values using sequences and loops of static values
  • Pass through: use functions from the original module
  • Mock is linked to the creating process (disable with nolink)
  • Complete call history showing calls, results and exceptions
  • Mocking of sticky modules (using the option unstick)
  • Throwing of expected exceptions that keeps the module valid


Here's an example of using meck in the Erlang shell:

Eshell V5.8.4  (abort with ^G)
1> meck:new(dog).
2> meck:expect(dog, bark, fun() -> "Woof!" end).
3> dog:bark().
4> meck:validate(dog).
5> meck:unload(dog).
6> dog:bark().
** exception error: undefined function dog:bark/0

Exceptions can be anticipated by meck (resulting in validation still passing). This is intended to be used to test code that can and should handle certain exceptions indeed does take care of them:

5> meck:expect(dog, meow, fun() -> meck:exception(error, not_a_cat) end).
6> catch dog:meow().
7> meck:validate(dog).

Normal Erlang exceptions result in a failed validation. The following example is just to demonstrate the behavior, in real test code the exception would normally come from the code under test (which should, if not expected, invalidate the mocked module):

8> meck:expect(dog, jump, fun(Height) when Height > 3 ->
                             (Height) ->
9> dog:jump(2).
10> catch dog:jump(5).
11> meck:validate(dog).

Here's an example of using meck inside an EUnit test case:

my_test() ->
    meck:expect(my_library_module, fib, fun(8) -> 21 end),
    ?assertEqual(21, code_under_test:run(fib, 8)), % Uses my_library_module

Pass-through is used when the original functionality of a module should be kept. When the option passthrough is used when calling new/2 all functions in the original module will be kept in the mock. These can later be overridden by calling expect/3 or expect/4.

Eshell V5.8.4  (abort with ^G)
1> meck:new(string, [unstick, passthrough]).
2> string:strip("  test  ").

It's also possible to pass calls to the original function allowing us to override only a certain behavior of a function (this usage is compatible with the passthrough option). passthrough/1 will always call the original function with the same name as the expect is is defined in):

Eshell V5.8.4  (abort with ^G)
1> meck:new(string, [unstick]).
2> meck:expect(string, strip, fun(String) -> meck:passthrough([String]) end).
3> string:strip("  test  ").
4> meck:unload(string).
5> string:strip("  test  ").


meck requires rebar to build. To build meck, got to the meck directory and simply type:

rebar compile

To make sure meck works on your platform, run the tests:

rebar eunit

Two things might seem alarming when running the tests:

  1. Warnings emitted by cover
  2. En exception printed by SASL

Both are expected due to the way Erlang currently prints errors. The important line you should look for is All XX tests passed, if that appears all is correct.


To install meck permanently, use of Agner is recommended:

agner install meck

If you want to install your own built version of meck add the ebin directory to your Erlang code path or move the meck folder into your release folder and make sure that folder is in your ERL_LIBS environment variable.


Patches are greatly appreciated!

Should you find yourself using meck and have issues, comments or feedback please create an issue here on GitHub.

Something went wrong with that request. Please try again.