【问题标题】:Mocking a DateTime parameter input模拟 DateTime 参数输入
【发布时间】:2021-07-24 15:18:28
【问题描述】:

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

【问题讨论】:

    标签: flutter intellij-idea mockito


    【解决方案1】:

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

    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)).....
      }
      

      生成器将创建一个采用可为空的 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 之后。

      【讨论】:

      • 已经在使用^5.0.11 版本,但仍然遇到同样的问题,尤其是如果模拟类是测试中类的依赖项。
      • @DavidB 你用过代码生成器吗?如果是这样,生成的模拟是什么样子的?我不认为生成器会创建不可为空的方法参数。
      • @DavidB 也许你应该给出更多你所经历的例子。你用 build_runner 生成模拟类,并在你的测试中创建这个模拟的实例。然后把这个实例传递给你想测试的类..
      • @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
      • @DavidB 我已经用你的例子更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多