// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_wkwebview/test/src/foundation/foundation_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_wkwebview/src/common/web_kit.pigeon.dart'
    as _i3;

import '../common/test_web_kit.pigeon.dart' as _i2;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

/// A class which mocks [TestNSObjectHostApi].
///
/// See the documentation for Mockito's code generation for more information.
class MockTestNSObjectHostApi extends _i1.Mock
    implements _i2.TestNSObjectHostApi {
  MockTestNSObjectHostApi() {
    _i1.throwOnMissingStub(this);
  }

  @override
  void dispose(int? identifier) => super.noSuchMethod(
        Invocation.method(
          #dispose,
          [identifier],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void addObserver(
    int? identifier,
    int? observerIdentifier,
    String? keyPath,
    List<_i3.NSKeyValueObservingOptionsEnumData?>? options,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #addObserver,
          [
            identifier,
            observerIdentifier,
            keyPath,
            options,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void removeObserver(
    int? identifier,
    int? observerIdentifier,
    String? keyPath,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #removeObserver,
          [
            identifier,
            observerIdentifier,
            keyPath,
          ],
        ),
        returnValueForMissingStub: null,
      );
}
