模拟 DateTime 参数输入

Mocking a DateTime parameter input

有人在向 DateTime 模拟方法参数提供 any Mockito 方法时遇到问题吗?基本上我在模拟 class 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);
  });
}

您是否尝试过使参数为 Nullable 以便方法变为

testMethod(DateTime? datetime)

最简单的方法是使用 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 的 DateTime 的方法,因此 any 将起作用。见 mockito documentation for more details.

更新:给你的例子应该是这样的:

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 builddart run build_runner build.