如何使用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
相关产品推荐
相关产品推荐

