unit-testing - Flutter Mockito - 模拟抛出异常
问题描述
刚开始在 Flutter 中使用 Mockito:
我想模拟调用方法时引发的异常。所以我这样做了:
when(mockInstance.foo(input).thenThrow(ArgumentError);
但是当期望它会抛出一个 ArgumentError 时:
expect(mockInstance.foo(input), throwsArgumentError);
我运行颤振测试,输出是测试失败,即使它表明它确实是一个 ArgumentError:
ArgumentError
package:mockito/src/mock.dart 346:7
PostExpectation.thenThrow.<fn>
package:mockito/src/mock.dart 123:37
Mock.noSuchMethod
package:-/--/---/Instance.dart 43:9 MockInstance.foo
tests/Instance_test.dart 113:26 ensureArgumentErrorIsThrown
我究竟做错了什么?
解决方案
如果您需要模拟异常,这两种方法都应该有效:
模拟调用并为
expect
函数提供一个函数,该函数一旦执行就会抛出(如果任何测试在expect
函数外抛出异常,Mockito 似乎会自动失败):when(mockInstance.foo(input)) .thenThrow(ArgumentError); expect( () => mockInstance.foo(input), // or just mockInstance.foo(input) throwsArgumentError, );
如果它是异步调用,并且您在 try-catch 块上捕获异常并返回某些内容,则可以使用
then.Answer
:when(mockInstance.foo(input)) .thenAnswer((_) => throw ArgumentError()); final a = await mockInstance.foo(input); // assert verify(...); expect(...)
如果模拟没有抛出异常:
expect( methodThatThrows()), throwsA(isA<YourCustomException>()), );
推荐阅读
- python - 如何使用从其他变量构建的变量?
- json - 数据缺失 JSONDecoder
- reactjs - 在 handleChange 方法中使用正确的 obj 调用测试调度
- excel - +1 水消耗以匹配的宏按钮 =Today()
- virtualenv - 将现有的 virtualenv 项目放入 virtualwrapper
- php - 查询结果只返回一个值
- wpf - LiveCharts 地理地图 WPF
- c - 使用 SIOCSIWSCAN ioctl 为 WEP 网络获取 wifi 安全类型
- javascript - 如何从组件中更改服务变量的值?
- connection - ActiveMQ 测试连接