flu*_*oob 6 unit-testing exception mockito flutter
刚开始在 Flutter 中使用 Mockito:
我想模拟调用方法时抛出的异常。所以我这样做了:
when(mockInstance.foo(input).thenThrow(ArgumentError);
Run Code Online (Sandbox Code Playgroud)
但是当期望它会抛出一个 ArgumentError 时:
expect(mockInstance.foo(input), throwsArgumentError);
Run Code Online (Sandbox Code Playgroud)
我运行 flutter test 并且输出是测试失败,即使它声明它确实是一个 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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
Gui*_*lva 10
如果您需要模拟异常,这两种方法都应该有效:
模拟调用并expect为函数提供一个预期在执行后抛出的函数(如果任何测试在函数外部抛出异常,Mockito 似乎会自动失败expect):
when(mockInstance.foo(input))
.thenThrow(ArgumentError);
expect(
() => mockInstance.foo(input), // or just mockInstance.foo(input)
throwsArgumentError,
);
Run Code Online (Sandbox Code Playgroud)
如果它是异步调用,并且您在 try-catch 块上捕获异常并返回某些内容,则可以使用then.Answer:
when(mockInstance.foo(input))
.thenAnswer((_) => throw ArgumentError());
final a = await mockInstance.foo(input);
// assert
verify(...);
expect(...)
Run Code Online (Sandbox Code Playgroud)
如果异常不是由模拟抛出的:
expect(
methodThatThrows(),
throwsA(isA<YourCustomException>()),
);
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题。尝试
expect(() => mockInstance.foo(input), throwsArgumentError);
Run Code Online (Sandbox Code Playgroud)
这是一个所有测试都通过的示例类
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
void main() {
test("",(){
var mock = new MockA();
when(mock.foo1()).thenThrow(new ArgumentError());
expect(() => mock.foo1(), throwsArgumentError);
});
test("",(){
var mock = new MockA();
when(mock.foo2()).thenThrow(new ArgumentError());
expect(() => mock.foo2(), throwsArgumentError);
});
test("",(){
var mock = new MockA();
when(mock.foo3()).thenThrow(new ArgumentError());
expect(() => mock.foo3(), throwsArgumentError);
});
test("",(){
var mock = new MockA();
when(mock.foo4()).thenThrow(new ArgumentError());
expect(() => mock.foo4(), throwsArgumentError);
});
}
class MockA extends Mock implements A {}
class A {
void foo1() {}
int foo2() => 3;
Future foo3() async {}
Future<int> foo4() async => Future.value(3);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |