Fix generation of duplicate mock getters and setters from inherited classes.
Fixes https://github.com/dart-lang/mockito/issues/325
PiperOrigin-RevId: 355624817
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2735969..3d8a40f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 5.0.0-nullsafety.7
+
+* Fix generation of duplicate mock getters and setters from inherited classes.
+
## 5.0.0-nullsafety.6
* Fix generation of method with a parameter with a default value which includes
diff --git a/lib/src/builder.dart b/lib/src/builder.dart
index 0342bbe..b0fa8ad 100644
--- a/lib/src/builder.dart
+++ b/lib/src/builder.dart
@@ -719,9 +719,10 @@
if (accessor.isPrivate || accessor.isStatic) {
continue;
}
- if (overriddenFields.contains(accessor)) {
+ if (overriddenFields.contains(accessor.name)) {
continue;
}
+ overriddenFields.add(accessor.name);
if (accessor.isGetter != null && _returnTypeIsNonNullable(accessor)) {
yield Method((mBuilder) => _buildOverridingGetter(mBuilder, accessor));
}
diff --git a/lib/src/version.dart b/lib/src/version.dart
index fd3e9bd..f804bd9 100644
--- a/lib/src/version.dart
+++ b/lib/src/version.dart
@@ -1 +1 @@
-const packageVersion = '5.0.0-nullsafety.6';
+const packageVersion = '5.0.0-nullsafety.7';
diff --git a/pubspec.yaml b/pubspec.yaml
index 14d4c09..a8baece 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: mockito
-version: 5.0.0-nullsafety.6
+version: 5.0.0-nullsafety.7
description: A mock framework inspired by Mockito.
homepage: https://github.com/dart-lang/mockito
diff --git a/test/builder/auto_mocks_test.dart b/test/builder/auto_mocks_test.dart
index 7252a42..df4e8cc 100644
--- a/test/builder/auto_mocks_test.dart
+++ b/test/builder/auto_mocks_test.dart
@@ -1363,6 +1363,19 @@
);
});
+ test('overrides inherited methods with a non-nullable return type', () async {
+ var mocksContent = await buildWithSingleNonNullableSource(dedent(r'''
+ class FooBase {
+ num m() => 7;
+ }
+ class Foo extends FooBase {
+ int m() => 7;
+ }
+ '''));
+ expect(mocksContent, contains('int m()'));
+ expect(mocksContent, isNot(contains('num m()')));
+ });
+
test('overrides methods with a potentially non-nullable parameter', () async {
await testWithNonNullable(
{
@@ -1430,6 +1443,19 @@
);
});
+ test('overrides inherited instance getters only once', () async {
+ var mocksContent = await buildWithSingleNonNullableSource(dedent('''
+ class FooBase {
+ num get m => 7;
+ }
+ class Foo extends FooBase {
+ int get m => 7;
+ }
+ '''));
+ expect(mocksContent, contains('int get m'));
+ expect(mocksContent, isNot(contains('num get m')));
+ });
+
test('overrides non-nullable instance setters', () async {
await expectSingleNonNullableOutput(
dedent('''
@@ -1468,6 +1494,19 @@
);
});
+ test('overrides inherited non-nullable instance setters only once', () async {
+ var mocksContent = await buildWithSingleNonNullableSource(dedent('''
+ class FooBase {
+ set m(int a) {}
+ }
+ class Foo extends FooBase {
+ set m(num a) {}
+ }
+ '''));
+ expect(mocksContent, contains('set m(num? a)'));
+ expect(mocksContent, isNot(contains('set m(int? a)')));
+ });
+
test('overrides non-nullable fields', () async {
await expectSingleNonNullableOutput(
dedent(r'''
@@ -1503,6 +1542,22 @@
);
});
+ test('overrides inherited non-nullable fields only once', () async {
+ var mocksContent = await buildWithSingleNonNullableSource(dedent('''
+ class FooBase {
+ num m;
+ }
+ class Foo extends FooBase<int> {
+ int get m => 7;
+ void set m(covariant int value) {}
+ }
+ '''));
+ expect(mocksContent, contains('int get m'));
+ expect(mocksContent, contains('set m(int? value)'));
+ expect(mocksContent, isNot(contains('num get m')));
+ expect(mocksContent, isNot(contains('set m(num? value)')));
+ });
+
test('overrides final non-nullable fields', () async {
await expectSingleNonNullableOutput(
dedent(r'''