首页 > 解决方案 > 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

我究竟做错了什么?

标签: unit-testingexceptionfluttermockito

解决方案


如果您需要模拟异常,这两种方法都应该有效:

  1. 模拟调用并为expect函数提供一个函数,该函数一旦执行就会抛出(如果任何测试在expect函数外抛出异常,Mockito 似乎会自动失败):

    when(mockInstance.foo(input))
      .thenThrow(ArgumentError);
    
    expect(
      () => mockInstance.foo(input), // or just mockInstance.foo(input)
      throwsArgumentError,
    );
    
  2. 如果它是异步调用,并且您在 try-catch 块上捕获异常并返回某些内容,则可以使用then.Answer

    when(mockInstance.foo(input))
      .thenAnswer((_) => throw ArgumentError());
    
    final a = await mockInstance.foo(input);
    
    // assert
    verify(...);
    expect(...)
    
  3. 如果模拟没有抛出异常:

    expect(
      methodThatThrows()),
      throwsA(isA<YourCustomException>()),
    );
    

推荐阅读