// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// A stand-in for another object which cannot be used except for specifically /// overridden methods. /// /// A fake has a default behavior for every field and method of throwing /// [UnimplementedError]. Fields and methods that are exercised by the code /// under test should be manually overridden in the implementing class. /// /// A fake does not have any support for verification or defining behavior from /// the test, it cannot be used as a mock. /// /// In most cases a shared full fake implementation without a `noSuchMethod` is /// preferable to `extends Fake`, however `extends Fake` is preferred against /// `extends Mock` mixed with manual `@override` implementations. /// /// __Example use__: /// /// // Real class. /// class Cat { /// String meow(String suffix) => 'Meow$suffix'; /// String hiss(String suffix) => 'Hiss$suffix'; /// } /// /// // Fake class. /// class FakeCat extends Fake implements Cat { /// @override /// String meow(String suffix) => 'FakeMeow$suffix'; /// } /// /// void main() { /// // Create a new fake Cat at runtime. /// var cat = new FakeCat(); /// /// // Try making a Cat sound... /// print(cat.meow('foo')); // Prints 'FakeMeowfoo' /// print(cat.hiss('foo')); // Throws /// } /// /// **WARNING**: [Fake] uses [noSuchMethod](goo.gl/r3IQUH), which is a _form_ of /// runtime reflection, and causes sub-standard code to be generated. As such, /// [Fake] should strictly _not_ be used in any production code, especially if /// used within the context of Dart for Web (dart2js, DDC) and Dart for Mobile /// (Flutter). abstract mixin class Fake { @override dynamic noSuchMethod(Invocation invocation) { throw UnimplementedError(invocation.memberName.toString().split('"')[1]); } }