You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用mocktail实现方法首次调用抛异常、第二次返回正确结果

Mocktail 实现多轮调用返回不同结果(含抛出异常)的方案

mocktail 不支持链式调用thenThrow、thenAnswer来配置多轮返回结果,你可以通过在thenAnswer内部维护调用计数器的方式实现需求,完整实现代码如下:

import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:mocktail/mocktail.dart';
import 'package:test/test.dart';

class MockClient extends Mock implements http.Client {}

void main() {
  const testUrl = 'https://test.example.com/api';
  final mockClient = MockClient();

  // 调用次数计数器
  int getCallCount = 0;
  when(() => mockClient.get(Uri.parse(testUrl))).thenAnswer((invocation) async {
    getCallCount++;
    // 第一次调用抛出SocketException
    if (getCallCount == 1) {
      throw const SocketException('Connection failed');
    }
    // 第二次及后续调用返回正常响应
    return http.Response('page content', 200);
  });

  // 测试验证代码示例
  test('测试http重试逻辑', () async {
    // 第一次调用触发异常
    expect(() => mockClient.get(Uri.parse(testUrl)), throwsA(isA<SocketException>()));
    // 第二次调用返回正常结果
    final resp = await mockClient.get(Uri.parse(testUrl));
    expect(resp.statusCode, 200);
    expect(resp.body, 'page content');
  });
}

扩展说明

  • 你可以根据测试需求扩展计数判断分支,支持任意次数的不同返回值、异常抛出逻辑
  • 如果需要在多个测试用例中复用mock配置,可以在setUp方法中重置计数器,避免不同用例的计数互相影响

内容的提问来源于stack exchange,提问作者Cavitedev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:54:02