dart-lang / mockito

Mockito-inspired mock library for Dart
https://pub.dev/packages/mockito
Apache License 2.0
623 stars 160 forks source link

mockito:mockBuilder generator fail using MockSpec custom superclass #729

Open oznecniV97 opened 6 months ago

oznecniV97 commented 6 months ago

Mockito generator fail using a custom superclass that extends MockSpec inside GenerateNiceMocks annotation.

Command: dart run build_runner build Error:

[SEVERE] mockito:mockBuilder on test/mockito_super_test.dart:
Null check operator used on a null value

The problem is related to _mockTargetFromMockSpec method inside lib/src/builder.dart file, because of superclass contains values inside (super) field.

E.g.:

import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'mockito_super_test.mocks.dart';

class ExampleMockSpec<T> extends MockSpec<T> {
  const ExampleMockSpec() : super();
}

class ExampleService {
  String testMethod() {
    return "example";
  }
}

@GenerateNiceMocks([ExampleMockSpec<ExampleService>()])
void main() {
  test('exampleTest', () {
    const mockValue = "mockValue";
    final mock = MockExampleService();
    when(mock.testMethod()).thenReturn(mockValue);
    expect(mock.testMethod(), mockValue);
  });
}
yanok commented 6 months ago

Uh, I feel like the right thing to do here is just to make MockSpec class final. Why would anyone want to subclass it?

oznecniV97 commented 6 months ago

I need to extend MockSpec to use a default fallbackGenerators for every classes.

EG:

class GetxMockSpec<T> extends MockSpec<T> {

  const GetxMockSpec() : super(
      fallbackGenerators: const {
        #onStart: fallbackGenerator,
      }
  );

}
yanok commented 6 months ago

Could be a wrapper function instead.

MockSpec<T> getxMockSpec<T>() => MockSpec<T>(fallbackGenerators: {#onStart: generator});

(and I really hope we'll be able to get rid of fallback generators in the next major version).

srawlins commented 6 months ago

Can the wrapper function be used in an annotation?

oznecniV97 commented 6 months ago

Wrapper function can't be used inside annotation: Methods can't be invoked in constant expressions.