This skill defines how to correctly use the mockito package for mocking in Dart and Flutter tests.
| Use | When |
|---|---|
| Real object | Prefer over mocks when practical. |
Fake (extends Fake) |
Lightweight custom implementation; override only the methods you need. Prefer over mocks when you don't need interaction verification. |
Mock (extends Mock) |
Only when you need to verify interactions (call counts, arguments) or stub dynamic responses. |
verify assertions; otherwise prefer real or fake objects.@GenerateMocks([MyClass])
// or for nice mocks (return simple legal values for missing stubs):
@GenerateNiceMocks([MockSpec<MyClass>()])
void main() { ... }
dart run build_runner build
test/ for mock generation by default.build.yaml if you need to generate mocks outside of test/.@override methods or implementations to a class extending Mock.final mock = MockCat();
// Return a value
when(mock.sound()).thenReturn('Meow');
// Throw an error
when(mock.sound()).thenThrow(Exception('No sound'));
// Calculate response at call time
when(mock.sound()).thenAnswer((_) => computedValue);
// Return values in sequence
when(mock.sound()).thenReturnInOrder(['Meow', 'Purr']);
@GenerateMocks → throws; @GenerateNiceMocks → returns a simple legal value.throwOnMissingStub(mock) to throw on any unstubbed call.verify(mock.sound()); // called at least once
verifyNever(mock.eat(any)); // never called
verify(mock.sound()).called(2); // called exactly twice
Async:
await untilCalled(mock.sound()); // wait for the interaction
// Flexible stubbing
when(mock.eat(any)).thenReturn(true);
when(mock.eat(argThat(isNotNull))).thenReturn(true);
// Named arguments
when(mock.fetch(any, headers: any)).thenReturn(response);
null as an argument adjacent to an argument matcher.any or argThat as values, not as argument names.final captured = verify(mock.eat(captureAny)).captured;
print(captured.last); // last captured argument
Use captureThat for conditional capturing.
reset(mock); // clear all stubs AND interactions
clearInteractions(mock); // clear only recorded interactions
To mock a function type (e.g., a callback), define an abstract class with the required signature and generate mocks for it:
abstract class Callback {
void call(String value);
}
@GenerateMocks([Callback])
logInvocations([mock1, mock2]); // print all collected invocations