whenFutureResult<T, E extends Object> function

PostExpectation<Future<Result<T, E>>> whenFutureResult<T, E extends Object>(
  1. Future<Result<T, E>> invocation(), {
  2. Result? dummy,
})

A wrapper for Mockito's when that simplifies stubbing methods returning Future<Result>.

Since Mockito requires a dummy value for non-nullable return types during stubbing, this utility allows providing a dummy value which is then registered via provideDummy for both Result<T, E> and Future<Result<T, E>>.

Example:

whenFutureResult(() => mock.getUser(), dummy: Ok(dummyUser))
  .thenAnswer((_) async => Ok(actualUser));

Implementation

PostExpectation<Future<Result<T, E>>> whenFutureResult<T, E extends Object>(
  Future<Result<T, E>> Function() invocation, {
  Result<dynamic, dynamic>? dummy,
}) {
  if (dummy != null) {
    final typedDummy = _castDummy<T, E>(dummy, 'whenFutureResult');
    provideDummy<Result<T, E>>(typedDummy);
    provideDummy<Future<Result<T, E>>>(Future.value(typedDummy));
  }

  try {
    return when(invocation());
  } on MissingDummyValueError catch (e) {
    throw Exception(
      'whenFutureResult: MissingDummyValueError occurred while stubbing a Future<Result>-returning method.\n'
      'This usually happens because the Result type needs dummy values registered with Mockito.\n\n'
      'To fix this, provide a dummy value to whenFutureResult:\n'
      "  whenFutureResult(() => mock.method(), dummy: Ok('dummy_value'))\n\n"
      'Original error: $e',
    );
  }
}