Насмешка над вводом параметра DateTime

#flutter #intellij-idea #mockito

Вопрос:

У кого-нибудь были проблемы с предоставлением метода any Mockito параметру метода DateTime mock? В принципе, у меня есть этот метод, реализованный в классе mock Future<int> testMethod(DateTime datetime) .

Поэтому , когда я попытался заглушить ответ в тестовом сценарии when(mockClass.testMethod(any)).thenAnswer((_) async => 1) , это всегда отображается в редакторе строк IntelliJ — error: The argument type 'Null' can't be assigned to the parameter type 'DateTime'. (argument_type_not_assignable) .


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

abstract class TestClass {
  Future<int> testMethod(DateTime dateTime);
}

class MockTestClass extends Mock implements TestClass {}

class InvokeClass {

  final TestClass testClass;

  InvokeClass(this.testClass);


}

// @GenerateMocks([InvokeClass, TestClass])
void main() {
  TestClass testClass = MockTestClass();
  InvokeClass invokeClass;

  setUp(() {
    testClass = MockTestClass();
    invokeClass = InvokeClass(testClass);
  });

  test('', () async {
    when(testClass.testMethod(any)).thenAnswer((_) => 1);
  });
}
 

Ответ №1:

Вы пробовали сделать параметр обнуляемым, чтобы метод стал

 testMethod(DateTime? datetime)
 

Ответ №2:

Самый простой способ-использовать генератор кода от mockito 5.0.0: https://pub.dev/packages/mockito#lets-create-mocks

в принципе, вы бы использовали:

 abstract class MyClass {
  Future<int> testMethod(DateTime dateTime);
}

@GenerateMocks([MyClass])
void main() {
  final mock = MockMyClass();
  when(mock.testMethod(any)).....
}
 

генератор создаст метод, который принимает значение даты-времени, допускающее значение null, поэтому any он будет работать. более подробную информацию смотрите в документации mockito.

Обновление: приводя свой пример, он должен выглядеть так:

 import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'testclass.mocks.dart'; // this will be generated by `build_runner build`

abstract class TestClass {
  Future<int> testMethod(DateTime dateTime);
}

class InvokeClass {

  final TestClass testClass;

  InvokeClass(this.testClass);


}

@GenerateMocks([TestClass])
void main() {
  MockTestClass testClass = MockTestClass();
  InvokeClass invokeClass;

  setUp(() {
    testClass = MockTestClass();
    invokeClass = InvokeClass(testClass);
  });

  test('', () async {
    when(testClass.testMethod(any)).thenAnswer((_) => 1);
  });
}
 

после этих изменений запустите flutter run build_runner build или dart run build_runner build .

Комментарии:

1. Уже использующий версию ^5.0.11 и все еще имеющий ту же проблему, особенно если макет класса является зависимостью тестируемого класса.

2. @DavidB вы использовали генератор кода? Если да, то как выглядит сгенерированный макет? Я не думаю, что генератор создаст ненулевые параметры метода.

3. @DavidB Возможно, вам следует привести больше примеров того, что вы испытываете.. Вы создаете макетные классы с помощью build_runner и создаете экземпляр этого макета в своем тесте.. и передаете этот экземпляр классу, который вы хотите протестировать..

4. @DavidB 1. измените ` TestClass TestClass = MockTestClass();` на final testClass = MockTestClass(); 2. удалите class MockTestClass extends Mock implements TestClass 3. добавьте инструкцию импорта: import testclass.mocks.dart 4. удалите // из @GenerateMocks 5. запустите flutter pub run build_runner build

5. @DavidB я обновил свой ответ вашим примером.