MOCKITO CHANGE LOG¶
Release 2.0.0 (March 10, 2026)¶
Deprecate verifyNoMoreInteractions in favor of ensureNoUnverifiedInteractions.
Deprecate verifyNoUnwantedInteractions in favor of verifyExpectedInteractions.
Context managers now check usage and any expectations (set via expect) on exit. The usage check can be disabled with the environment variable
MOCKITO_CONTEXT_MANAGERS_CHECK_USAGE="0".The between matcher now supports open ranges, e.g. between=(0,) to assert that at least 0 interactions occurred.
Calling thenAnswer() without arguments is now allowed and is treated like thenReturn() without arguments: the stubbed method will return None.
Added a first-class InOrder API via
mockito.InOrder. The legacy in-order mode only supported one mock at a time; the new API supports true cross-mock order verification.Migration:
# Before from mockito import inorder inorder.verify(cat).meow() inorder.verify(cat).purr() # Now from mockito import InOrder in_order = InOrder(cat) # <== pass multiple objects for cross-mock verification! in_order.verify(cat).meow() in_order.verify(cat).purr()
The legacy in-order verification mode (
inorder.verify(...)) is deprecated in favor ofInOrder(...).Added first-class async/await stubbing support: async callables now preserve awaitable behavior for thenReturn, thenRaise, and thenAnswer.
Note
Async introspection metadata (e.g.
inspect.iscoroutinefunction) for stub wrappers is currently implemented only on Python 3.12+.Expanded
mock({...})constructor shorthands; see mock() configuration and shorthands.Added first-class property/descriptor stubbing support.
E.g.:
class F: @property def p(self): return "orig" when(F).p.thenReturn("stub") assert F().p == "stub"
Added chained stubbing and expectations across call/property hops, e.g.:
when(cat).meow().purr().thenReturn(...) when(User).query.filter_by(...).first() expect(cat, times=1).meow().purr()
Allow
...in fixed argument positions as an ad-hoc any matcher. Trailing positional...keeps its existing “rest” semantics.E.g.:
when(api).call("users", active=...).thenReturn("ok") assert api.call("users", active=True) == "ok" api.call("users") # will raise InvocationError, kwarg "active" is missing when(api).call("users", ...) # used as a rest matcher as before
Extend
captorto be used as a rest matcherE.g., support:
args = captor() when(freud).says(*args).thenReturn("Yes.") assert freud.says("Are", "you", "dreaming?") == "Yes." assert args.value == ("Are", "you", "dreaming?") # or kwargs = captor() when(freud).does(**kwargs).thenReturn(False)
Added
call_captor:call = call_captor() when(mock).do(call).thenReturn("ok") mock.do(1, 2, x=3) assert call.value == ((1, 2), {"x": 3})
Added
patch_attrandpatch_dictfor non-callable monkeypatch-style use cases (e.g. sys.stdout, sys.argv, and environment/config dictionaries) with context-manager support and restoration through unstub.E.g.:
patch_attr("sys.argv", ["foo", "bar"]) with patch_attr("sys.stdout", StringIO()) as stdout: ... with patch_dict(os.environ, {"user": "bob"}): ...
Added explicit partial-unstub targeting by host + attribute name. This complements method-reference partial unstub (e.g.
unstub(cat.meow)) and supports tuple form and shorthand form, including multiple attributes in one call.E.g.:
unstub(cat.meow) unstub((cat, "meow")) unstub(cat, "meow") unstub((cat, "meow"), (os.path, "exists"))
Also implemented unstub(“os.path”) - the string variant.
Packaging is now fully defined via
pyproject.toml(hatchlingbackend); the obsoletesetup.pyshim has been removed.
Release 1.5.5 (November 17, 2025)¶
Improved behavior of the ad-hoc methods of mocks. (#92)
Make the shortcut when(mock).foo().thenReturn() officially work and just assume the user forgot the None as return value.
Release 1.5.4 (January 22, 2025)¶
Implement defined behavior for deepcopy for mocks. (#91)
Release 1.5.3 (November 9, 2024)¶
Maintenance release adding support for Python 3.13.
Release 1.5.2 (November 6, 2024)¶
Fixed issue (#86) where you couldn’t setup expectations for objects or mocks with an overridden __eq__ method.
Release 1.5.1 (September 4, 2024)¶
Fixed issue (#82) with methods which have arguments named value or exception.
Release 1.5.0 (March 4, 2024)¶
@Oracking fixed expect to support a string as its first argument. All other functions supported that already. E.g.
- ::
expect(‘os.path’, times=2).exists(…).thenReturn(True)
Release 1.4.0 (August 25, 2022)¶
@avandierast implemented thenCallOriginalImplementation. See #60
# Let `os.path.exists` use the real filesystem (often needed when
# the testing framework needs itself a working `os.path.exists`
# implementation) *but* fake a `.flake8` file.
when(os.path).exists(...).thenCallOriginalImplementation()
when(os.path).exists('.flake8').thenReturn(True)
Release 1.3.5 (August 18, 2022)¶
Restore compatibility with Python 2.7
Release 1.3.3 (June 23, 2022)¶
Hotfix: Correctly unstub methods extracted to the module level, for example
random.randint()et.al. from the standard library. See #53
Release 1.3.2 (June 23, 2022)¶
Let mock(spec=SomeClass) work just as mock(SomeClass)
Release 1.3.1 (June 14, 2022)¶
Reimplement captor to capture only during execution phase of a test.
Release 1.3.0 (December 3, 2021)¶
Teach captor to remember all used values (@shashankrnr32). E.g.
arg = captor()
mock.do_something(123)
mock.do_something(456)
verify(mock).do_something(arg)
assert arg.all_values == [123, 456]
Release 1.2.2 (September 9, 2020)¶
Fix typo in
spy2doc
Release 1.2.1 (February 19, 2020)¶
@nielsvaneck fixed how we can lookup inherited classmethods.
Release 1.2.0 (November 25, 2019)¶
Code base now is python 3 compatible. No 2to3 anymore.
Fine tune error messages on unexpected calls or verifications. E.g. if you expect
when(dog).bark('Wuff')but on call time dodog.bark('Wufff'). Likewise, if you calldog.bark('Miau')and thenverify(dog).bark('Maui').@felixonmars fixed a small compatibility issue with python 3.8
Mocking properties has become a bit easier. (#26) E.g.
prop = mock()
when(prop).__get__(...).thenReturn(23)
m = mock({'name': prop})
Release 1.1.1 (August 28, 2018)¶
Fix: The context manager (
with) has now a proper implementationFix: Calling
patchwith two arguments can now be used withwithFix: Do not treat the placeholder arguments (Ellipsis, args, kwargs) as special on call time anymore. (T.i. they only have a meaning when stubbing or verifying.)
Enhancement: Changed some truthy or equality tests to identity (
is) tests. This reduces edge-cases where some user object defines__eq__or__bool__. (Hello _numpy_!)
Release 1.1.0 (May 2, 2018)¶
Added
forget_invocationsfunction. Thanks to @maximkulkin
This is generally useful if you already call mocks during your setup routine.
Now you could call forget_invocations at the end of your setup, and
have a clean ‘recording’ for your actual test code. T.i. you don’t have
to count the invocations from your setup code anymore.
Release 1.0.12 (June 3, 2017)¶
Better error messages for failed verifications. By @lwoydziak
Release 1.0.7 - 1.0.10 (January 31 - February 2, 2017)¶
verifyZeroInteractionsimplemented. This is actually a breaking change, becauseverifyZeroInteractionswas an alias forverifyNoMoreInteractions(sic!). If you used it, just call the other function.verifyStubbedInvocationsAreUsedimplemented. This is meant to be called right before anunstuband should improve long time maintenance. It doesn’t help during design time. Note that pytest-mockito automatically calls this for you.All verify* functions now warn you if you pass in an object which was never stubbed.
Release 1.0.0 - 1.0.5 (January 24 - 27, 2017)¶
This is a major update; mostly because of internal code reorganization (imports) it cannot be guaranteed that this will not break for you. Though if you just used the public API you should be fine. None of the vintage old tests have been removed and they at least pass.
In general unclassified imports (from mocktio import *) are not recommended. But if you did, we do not export Mock anymore. Mock has been deprecated long ago and is now for internal use only. You must use mock.
Another important change is, that mockito’s strict mode is far more strict than before. We now generally try to match the signature of the target method with your usage. Usually this should help you find bugs in your code, because it will make it easier to spot changing interfaces.
mock,when,verifyreturn mostly empty objects. It is unlikely to have a method_name clash.Specced mocks
instance = mock(Class)will pass isinstance tests likeisinstance(instance, Class)For
whenandverifythe function signature or argument matchers can be greatly simplified. E.g.when(requests).get(...).thenReturn('OK')will match any argument you pass in. There areargsandkwargsmatchers as well. Sowhen(requests).get('https://...', **kwargs).thenReturn(...)will make an exact match on the first argument, the url, and ignore all the headers and other stuff.Mocks can be preconfigured:
mock({'text': 'OK'}). For specced mocks this would be e.g.mock({'text': 'OK'}, spec=requests.Response).If you mock or patch an object, the function signatures will be matched. So:
def foo(a, b=1): ... when(main).foo(12) # will pass when(main).foo(c=13) # will raise immediately
Mock Dummies are now callable:
m = mock() m(1, 2) verify(m).__call__(...)
Mock()is now an implementation detail; it is not exported anymore. Usemock().You can unstub individual patched objects
unstub(obj). (Before it was all or nothing.)Added basic context manager support when using
when. Note thatverifyhas to be called within the with context.
with when(rex).waggle().thenReturn('Yup'):
assert rex.waggle() == 'Yup'
verify(rex).waggle()
Aliased
any_toANY,argstoARGSandkwargstoKWARGS. You can use python’s builtinanyas a stand in forANY.As a convenience you can use our
any_matcher like a type instead ofany_():dummy(1) verify(dummy).__call__(ANY)
Added
when2,expect,spy2Make the mocked function (replacement) more inspectable. Copy __doc__, __name__ etc.
You can configure magic methods on mocks:
dummy = mock() when(dummy).__getitem__(1).thenReturn(2) assert dummy[1] == 2
Release 0.7.1 (December 27, 2016)¶
Fix: Allow
verifyNoMoreInteractionscall for real (stubbed) objects
Release 0.7.0 (July 15, 2016)¶
Added a ton of new argument matchers. Namely:
'and_', 'or_', 'not_', 'eq', 'neq', 'lt', 'lte', 'gt', 'gte', 'arg_that', 'matches', 'captor'
Aliases
anymatcher toany_because it’s a builtin.Fixes an issue where mockito could not correctly verify your function invocations, if you grabbed a method from its object and used it (‘detached’) as a plain function:
m = mock() f = m.foo # detach f(1, 2) # pass it around and use it like a function f(2, 3) verify(m).foo(...) # finally verify interactions
Thank you @maximkulkin
Release 0.6.1 (May 20, 2016)¶
Added
thenAnswer(callable). The callable will be called to compute the answer the stubbed method will return. For that it will receive the arguments of the caller:m = mock() when(m).do_times(any(), any()).thenAnswer(lambda one, two: one * two) self.assertEquals(20, m.do_times(5, 4))
Thank you @stubbsd
Release 0.6.0 (April 25, 2016)¶
Print keyword arguments nicely.
Be very forgiving about return values and assume None as default. T.i.
when(Dog).bark('Miau').thenReturn()is enough to return None.Make keyword argument order unimportant.
BREAKING CHANGE: Throw early when calling not expected methods in strict mode.
Release 0.5.3 (April 23, 2016)¶
Remove hard coded distribute setup files.
Release 0.5.1 (August 4, 2010)¶
- BUG Fixes:
Fixed issue #9 [http://bitbucket.org/szczepiq/mockito-python/issue/9] : Generating stubs from classes caused method to be replaced in original classes.
Release 0.5.0 (July 26, 2010)¶
- API Changes:
Added possibility to spy on real objects.
Added “never” syntactic sugar for verifications.
- BUG Fixes:
Fixed issue with named arguments matching.
- Other Changes:
Python 2.7 support
Deprecated APIs now generate deprecation warnings.
Release 0.4.0 (July 2, 2010)¶
- API Changes:
Added possibility to verify invocations in order.
- BUG Fixes:
Fixed issue with installing mockito from egg without distribute installed.
Release 0.3.1¶
Bug-fix release.
- Bug Fixes:
Fixed annoying issue #8 [http://bitbucket.org/szczepiq/mockito-python/issue/8]
Release 0.3.0¶
- API Changes:
Renamed mock creation method from “Mock” (upper “M”) to “mock”. Old name stays for compatibility until 1.0 release.
- Other Changes:
Official Python3 support via distutils + 2to3.