将颤振代码迁移到空安全后,模拟对象不接受“任何”
Posted
技术标签:
【中文标题】将颤振代码迁移到空安全后,模拟对象不接受“任何”【英文标题】:After migrating flutter code to null-safety, mock objects not accepting `any` 【发布时间】:2021-06-09 11:04:53 【问题描述】:Flutter 2 发布后,我已将我的代码迁移到 sdk: '>=2.12.0 <3.0.0'
,现在所有代码都是“可靠的 null 安全”。但是我在使用 mockito 5.0.0 进行单元测试时遇到了错误
例如:
when(mockClient.login(any)).thenThrow(GrpcError.unavailable());
之前还可以,但是现在编译器在any
下显示错误,提示:
The argument type 'Null' can't be assigned to the parameter type 'LoginRequest'
我从 mockito 存储库中阅读了 this link,但我希望有一种更简单的方法来为具有“不可为空”参数的方法编写测试,就像以前一样。
【问题讨论】:
我下面的解决方案能解决您的问题吗? 【参考方案1】:请参阅the solution here. 您可以使用 mocktail 包,它更容易。
有了 mocktail 你的代码会变成
when(() => mockClient.login(any())).thenThrow(GrpcError.unavailable());
【讨论】:
【参考方案2】:在分配 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
【讨论】:
【参考方案3】:any
返回 null 并且 null 值不允许传递给您的 login
方法。
这是NNBD的主要缺点,模拟比以前容易得多。
https://github.com/dart-lang/mockito/blob/master/NULL_SAFETY_README.md#problems-with-typical-mocking-and-stubbing
【讨论】:
以上是关于将颤振代码迁移到空安全后,模拟对象不接受“任何”的主要内容,如果未能解决你的问题,请参考以下文章
迁移到空安全版本 Provider 5.0.0 后对 Stream Provider 的更改
将我的 bloc 应用程序迁移到空安全。错误:“AssignmentBloc”不符合类型参数“B”的绑定“BlocBase<AssignmentState>”