Tillitsdone
down Scroll to discover

Mock Dio Requests for Flutter Unit Testing

Learn how to effectively mock Dio HTTP requests in Flutter for reliable unit testing.

Discover best practices, code examples, and practical implementation techniques for testing network calls.
thumbnail

Testing Network Requests in Flutter: A Guide to Mocking Dio

A modern abstract architectural structure with flowing curves and glass panels dominated by bright azure blue and gleaming metallic silver photographed from a low upward angle against a clear sky high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

In the world of Flutter development, handling and testing network requests is a crucial skill. While Dio is an excellent HTTP client for making API calls, testing these network interactions can be challenging. Today, let’s explore how to effectively mock Dio requests for unit testing in Flutter.

Understanding the Importance of Mocking

When writing unit tests, we want them to be fast, reliable, and independent of external services. Making actual network calls during tests can lead to flaky tests and slower execution times. This is where mocking comes in handy.

Geometric abstract composition with intersecting planes and light beams featuring stone blue concrete gray and deep black colors captured from a straight-on perspective with strong directional lighting high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

Setting Up Your Testing Environment

First, let’s set up our testing environment with the necessary dependencies. Add these to your pubspec.yaml:

dev_dependencies:
mockito: ^5.4.0
http_mock_adapter: ^0.4.4

Creating Mock Responses

Let’s look at a practical example of how to mock Dio requests. We’ll create a simple user service and test it:

class UserService {
final Dio dio;
UserService(this.dio);
Future<User> getUser(int id) async {
final response = await dio.get('/users/$id');
return User.fromJson(response.data);
}
}

Here’s how we can test this service:

void main() {
late Dio dio;
late UserService userService;
late DioAdapter dioAdapter;
setUp(() {
dio = Dio();
dioAdapter = DioAdapter(dio: dio);
dio.httpClientAdapter = dioAdapter;
userService = UserService(dio);
});
test('should return user when API call is successful', () async {
final mockData = {
'id': 1,
'name': 'John Doe',
'email': 'john@example.com'
};
dioAdapter.onGet(
'/users/1',
(server) => server.reply(200, mockData),
);
final user = await userService.getUser(1);
expect(user.name, equals('John Doe'));
expect(user.email, equals('john@example.com'));
});
}

Elegant flowing curves of walnut and iron materials intertwined in an abstract form with warm umber highlights photographed from a diagonal elevated angle high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

Best Practices for Mocking Dio

  1. Always mock error scenarios
  2. Test different HTTP methods
  3. Verify request headers and parameters
  4. Test timeout scenarios
  5. Mock interceptors when needed

Here’s an example of testing an error scenario:

test('should throw exception when API call fails', () async {
dioAdapter.onGet(
'/users/1',
(server) => server.throws(
404,
DioError(
requestOptions: RequestOptions(path: '/users/1'),
response: Response(
statusCode: 404,
requestOptions: RequestOptions(path: '/users/1'),
),
),
),
);
expect(
() => userService.getUser(1),
throwsA(isA<DioError>()),
);
});

Conclusion

Mocking Dio requests is essential for writing reliable unit tests in Flutter. By following these patterns and best practices, you can ensure your network-related code is thoroughly tested and maintainable.

Minimalist architectural installation with clean lines and geometric shapes featuring bright seaweed green and maroon accents against light stone surfaces viewed from a bird's eye perspective high-quality ultra-realistic cinematic 8K UHD high resolution sharp and detail

icons/logo-tid.svgicons/flutter.svg

Talk with CEO

Ready to bring your web/app to life or boost your team with expert Thai developers?
Contact us today to discuss your needs, and let’s create tailored solutions to achieve your goals. We’re here to help at every step!
🖐️ Contact us
Let's keep in Touch
Thank you for your interest in Tillitsdone! Whether you have a question about our services, want to discuss a potential project, or simply want to say hello, we're here and ready to assist you.
We'll be right here with you every step of the way.
Contact Information
rick@tillitsdone.com+66824564755
Find All the Ways to Get in Touch with Tillitsdone - We're Just a Click, Call, or Message Away. We'll Be Right Here, Ready to Respond and Start a Conversation About Your Needs.
Address
9 Phahonyothin Rd, Khlong Nueng, Khlong Luang District, Pathum Thani, Bangkok Thailand
Visit Tillitsdone at Our Physical Location - We'd Love to Welcome You to Our Creative Space. We'll Be Right Here, Ready to Show You Around and Discuss Your Ideas in Person.
Social media
Connect with Tillitsdone on Various Social Platforms - Stay Updated and Engage with Our Latest Projects and Insights. We'll Be Right Here, Sharing Our Journey and Ready to Interact with You.
We anticipate your communication and look forward to discussing how we can contribute to your business's success.
We'll be here, prepared to commence this promising collaboration.
Frequently Asked Questions
Explore frequently asked questions about our products and services.
Whether you're curious about features, warranties, or shopping policies, we provide comprehensive answers to assist you.