| // 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]); | |
| } | |
| } |