mockito 在将颤动代码迁移到空安全之后,模拟对象不接受'任何'

dauxcl2d  于 2022-11-08  发布在  其他
关注(0)|答案(5)|浏览(141)

在Flutter 2发布之后,我已经将代码迁移到sdk: '>=2.12.0 <3.0.0',现在所有代码都是“sound null safety”。
例如:

when(mockClient.login(any)).thenThrow(GrpcError.unavailable());

之前没有问题,但现在,编译器在any下显示错误,指示:The argument type 'Null' can't be assigned to the parameter type 'LoginRequest'
我从mockito repo中读到了this link,但是我希望有一种更简单的方法来为像以前一样带有“不可空”参数的方法编写测试。

eni9jsuy

eni9jsuy1#

当分配Mock对象时,它需要是Mock对象类型,而不是BaseClass。

@GenerateMocks(MockSpec<ITransactionRepository>(as: #MockTransactionRepository),
)
void main()
{
    ....
    ITransactionRepository baseObject = MockTransactionRepository();           // wrong
    MockTransactionRepository mockObject = MockTransactionRepository();   // right
    when(baseObject.method(any));     // results in compile error
    when(mockObject.method(any)); // OK
    ...
}

来源:https://github.com/dart-lang/mockito/issues/364

5m1hhzi4

5m1hhzi42#

请参阅the solution here.您可以使用mocktail软件包,这使得它更容易。
使用mocktail,您的代码将变成

when(() => mockClient.login(any())).thenThrow(GrpcError.unavailable());
c90pui9n

c90pui9n3#

any返回空值,并且不允许将空值传递给login方法。
这是NNBD的主要缺点,嘲笑比以前容易得多。
https://github.com/dart-lang/mockito/blob/master/NULL_SAFETY_README.md#problems-with-typical-mocking-and-stubbing

i86rm4rw

i86rm4rw4#

处理mockito中的零安全
第1步:不要手动创建模拟类和实现,因此请删除它们
第2步:安装build_runner以使用dart代码生成文件
第3步:将import 'package:mockito/annotations.dart';添加到测试文件
第4步:在void main()函数上面用@GenerateMocks([YourClassToBeMocked])注解你要模拟的目标类
第5步:运行build_runner来生成带有--delete-conflicting-outputs标志mock,因此在您的终端中键入:flutter pub run build_runner build --delete-conflicting-outputs。启用此选项将跳过提示并删除文件。此选项通常应用于继续集成服务器和测试,但不应用于其他情况。
步骤6:生成模拟文件后,将其导入到您的测试中(它位于测试文件的同一目录中),然后您就可以在where方法中使用any,并在类中使用一个不可空变量,即使没有实现它。
完整答案请查看this link

lp0sw83n

lp0sw83n5#

在模拟类中调用的函数,使参数可为空。如果要模拟此类方法:

class Example {
    String method(String str) {}
}

将String参数设为可为Null,如下所示:

String method(String? str) {}

希望能成功。

相关问题