19

在 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 repo 中阅读了这个链接,但我希望有一种更简单的方法来为具有“不可为空”参数的方法编写测试,就像以前一样。

4

3 回答 3

8

分配 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

于 2021-07-15T17:40:35.777 回答
6

在此处查看解决方案。您可以使用 mocktail 包,它更容易。

使用 mocktail,您的代码将变为

when(() => mockClient.login(any())).thenThrow(GrpcError.unavailable());
于 2021-04-30T17:46:24.107 回答
3

any返回 null 并且不允许将 null 值传递给您的login方法。

这是 NNBD 的主要缺点,模拟比以前容易得多。

https://github.com/dart-lang/mockito/blob/master/NULL_SAFETY_README.md#problems-with-typical-mocking-and-stubbing

于 2021-03-11T12:48:05.780 回答