#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 я обновил свой ответ вашим примером.