<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: cyberail</title>
    <description>The latest articles on DEV Community by cyberail (@cyberail).</description>
    <link>https://dev.to/cyberail</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F519426%2Fd305bf55-d2ff-4f30-9762-a62c3d5f0832.png</url>
      <title>DEV Community: cyberail</title>
      <link>https://dev.to/cyberail</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cyberail"/>
    <language>en</language>
    <item>
      <title>Scroll Is Not Just Position: Introducing scroll_velocity_notifier</title>
      <dc:creator>cyberail</dc:creator>
      <pubDate>Tue, 23 Dec 2025 09:41:56 +0000</pubDate>
      <link>https://dev.to/cyberail/scroll-is-not-just-position-introducing-scrollvelocitynotifier-5g0h</link>
      <guid>https://dev.to/cyberail/scroll-is-not-just-position-introducing-scrollvelocitynotifier-5g0h</guid>
      <description>&lt;p&gt;&lt;em&gt;Available on &lt;a href="https://pub.dev/packages/scroll_velocity_notifier" rel="noopener noreferrer"&gt;pub.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When we work with scrolling in Flutter, we usually think in terms of &lt;strong&gt;position&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Where is the user right now?&lt;br&gt;
How many pixels did they scroll?&lt;br&gt;
Are we at the top or the bottom?&lt;/p&gt;

&lt;p&gt;But scroll has another dimension that often gets ignored: &lt;strong&gt;speed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How fast the user scrolls carries intent.&lt;br&gt;
It tells you &lt;em&gt;how&lt;/em&gt; something is happening, not just &lt;em&gt;where&lt;/em&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why scroll velocity matters
&lt;/h2&gt;

&lt;p&gt;Think about these interactions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An AppBar hides only when the user scrolls &lt;em&gt;fast&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;A floating button fades out on quick flicks, but stays on slow scrolls&lt;/li&gt;
&lt;li&gt;Animations trigger based on &lt;em&gt;gesture intent&lt;/em&gt;, not offset&lt;/li&gt;
&lt;li&gt;Overscroll feels elastic and alive instead of binary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these depend on &lt;strong&gt;scroll velocity&lt;/strong&gt;, not scroll position.&lt;/p&gt;

&lt;p&gt;Flutter exposes &lt;code&gt;ScrollNotification&lt;/code&gt;s, but it doesn’t give you velocity in a form that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smooth&lt;/li&gt;
&lt;li&gt;stable&lt;/li&gt;
&lt;li&gt;reusable&lt;/li&gt;
&lt;li&gt;decoupled from layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s the gap this package tries to fill.&lt;/p&gt;


&lt;h2&gt;
  
  
  What &lt;code&gt;scroll_velocity_notifier&lt;/code&gt; is
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;scroll_velocity_notifier&lt;/code&gt; is a small Flutter package that calculates &lt;strong&gt;real-time scroll velocity&lt;/strong&gt; (in pixels per second) directly from &lt;code&gt;ScrollNotification&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;It doesn’t replace scroll views.&lt;br&gt;
It doesn’t change layouts.&lt;br&gt;
It doesn’t force any architecture.&lt;/p&gt;

&lt;p&gt;It simply observes scrolling and tells you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The user is scrolling this fast right now.”&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Design goals
&lt;/h2&gt;

&lt;p&gt;From the beginning, the goals were intentionally modest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No layout impact&lt;/strong&gt;&lt;br&gt;
The widget should not affect rendering or rebuild children.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No global state&lt;/strong&gt;&lt;br&gt;
Everything should be opt-in and local.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No architectural opinion&lt;/strong&gt;&lt;br&gt;
Works equally well with Bloc, Riverpod, streams, or plain callbacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Human-friendly values&lt;/strong&gt;&lt;br&gt;
Raw velocity is noisy — the output should be usable directly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  How it works (conceptually)
&lt;/h2&gt;

&lt;p&gt;The widget listens to &lt;code&gt;ScrollUpdateNotification&lt;/code&gt;s and measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the change in scroll position (pixels)&lt;/li&gt;
&lt;li&gt;the time between updates (microseconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From that, it calculates velocity in &lt;strong&gt;pixels per second&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To make the values stable enough for UI logic, it applies &lt;strong&gt;Exponential Moving Average (EMA)&lt;/strong&gt; smoothing.&lt;br&gt;
This removes jitter and produces velocity that feels intentional rather than mechanical.&lt;/p&gt;


&lt;h2&gt;
  
  
  Overscroll is optional — and intentional
&lt;/h2&gt;

&lt;p&gt;In many Flutter apps, overscroll is not just an edge case — it’s part of the interaction.&lt;/p&gt;

&lt;p&gt;When using physics like &lt;code&gt;BouncingScrollPhysics&lt;/code&gt;, the scroll position can move beyond its bounds.&lt;br&gt;
Sometimes you want velocity there. Sometimes you don’t.&lt;/p&gt;

&lt;p&gt;For that reason, overscroll handling is explicit.&lt;/p&gt;

&lt;p&gt;By default, velocity during overscroll is reported as &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can opt into overscroll velocity when you need it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;ScrollVelocityProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;includeOversScroll:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;onNotification:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;velocity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;debugPrint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Velocity: &lt;/span&gt;&lt;span class="si"&gt;$velocity&lt;/span&gt;&lt;span class="s"&gt; px/s'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;physics:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;BouncingScrollPhysics&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps behavior predictable and avoids accidental effects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Basic usage with a callback
&lt;/h2&gt;

&lt;p&gt;The simplest way to use the package is via a callback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;ScrollVelocityProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;onNotification:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;velocity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;debugPrint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Velocity: &lt;/span&gt;&lt;span class="si"&gt;$velocity&lt;/span&gt;&lt;span class="s"&gt; px/s'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;itemCount:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;itemBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Item &lt;/span&gt;&lt;span class="si"&gt;$index&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You wrap any scrollable widget and start receiving velocity values.&lt;/p&gt;

&lt;p&gt;No controllers required.&lt;br&gt;
No rebuilds triggered.&lt;br&gt;
No extra layout widgets.&lt;/p&gt;


&lt;h2&gt;
  
  
  Using a StreamController (advanced usage)
&lt;/h2&gt;

&lt;p&gt;For more complex scenarios, you can pass a &lt;strong&gt;StreamController&lt;/strong&gt; to receive scroll velocity events.&lt;/p&gt;

&lt;p&gt;This is useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple consumers need the same scroll signal&lt;/li&gt;
&lt;li&gt;velocity is handled outside the widget tree&lt;/li&gt;
&lt;li&gt;you want to plug it into Bloc, Cubit, or analytics logic
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;StreamController&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ScrollStreamNotification&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;broadcast&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nd"&gt;@override&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;ScrollVelocityProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;controller:&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;ListView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;itemCount:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;itemBuilder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Item &lt;/span&gt;&lt;span class="si"&gt;$index&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Listening to the stream:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;debugPrint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Velocity: &lt;/span&gt;&lt;span class="si"&gt;${event.velocity}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The widget &lt;strong&gt;never owns the controller&lt;/strong&gt;.&lt;br&gt;
If you pass one, you control its lifecycle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a ProxyWidget?
&lt;/h2&gt;

&lt;p&gt;Internally, the package is implemented using a &lt;code&gt;ProxyWidget&lt;/code&gt; and &lt;code&gt;ProxyElement&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;children are not rebuilt&lt;/li&gt;
&lt;li&gt;layout is untouched&lt;/li&gt;
&lt;li&gt;the widget simply participates in the notification chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s safe to use even in large or deeply nested scroll hierarchies.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it is &lt;em&gt;not&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;This package is intentionally small.&lt;/p&gt;

&lt;p&gt;It does not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;animate anything for you&lt;/li&gt;
&lt;li&gt;modify scroll physics&lt;/li&gt;
&lt;li&gt;enforce UX decisions&lt;/li&gt;
&lt;li&gt;hide behavior behind magic thresholds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It gives you data — you decide how to use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Scrolling is one of the most frequent interactions in mobile apps, yet it’s often treated as a binary signal: moved or not moved.&lt;/p&gt;

&lt;p&gt;Velocity adds nuance.&lt;/p&gt;

&lt;p&gt;It captures intent, rhythm, and subtlety that position alone can’t express.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scroll_velocity_notifier&lt;/code&gt; is a small attempt to make that nuance accessible in Flutter — without adding complexity where it doesn’t belong.&lt;/p&gt;




&lt;p&gt;📦 &lt;strong&gt;Package:&lt;/strong&gt; &lt;code&gt;scroll_velocity_notifier&lt;/code&gt;&lt;br&gt;
🔗 &lt;strong&gt;Available on:&lt;/strong&gt; &lt;a href="https://pub.dev/packages/scroll_velocity_notifier" rel="noopener noreferrer"&gt;pub.dev&lt;/a&gt;&lt;br&gt;
🛠 &lt;strong&gt;Platform:&lt;/strong&gt; Flutter / Dart&lt;/p&gt;

</description>
      <category>ux</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>ui</category>
    </item>
    <item>
      <title>Simulating HTTP request/response workflow for effective testing in Dart/Flutter via http-mock-adapter</title>
      <dc:creator>cyberail</dc:creator>
      <pubDate>Mon, 23 Nov 2020 15:11:12 +0000</pubDate>
      <link>https://dev.to/lomsa/simulating-http-request-response-workflow-for-effective-testing-in-dart-flutter-via-http-mock-adapter-5eii</link>
      <guid>https://dev.to/lomsa/simulating-http-request-response-workflow-for-effective-testing-in-dart-flutter-via-http-mock-adapter-5eii</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm3022zvgmufx2771g67j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fm3022zvgmufx2771g67j.png" alt="Alt Text" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/http_mock_adapter" rel="noopener noreferrer"&gt;&lt;strong&gt;http-mock-adapter&lt;/strong&gt;&lt;/a&gt; is a Dart package built upon &lt;a href="https://pub.dev/packages/dio" rel="noopener noreferrer"&gt;Dio&lt;/a&gt; &amp;amp; &lt;a href="https://pub.dev/packages/mockito" rel="noopener noreferrer"&gt;Mockito&lt;/a&gt;. By simply defining requests and corresponding responses through predefined adapters, you will be able to mock requests sent via Dio. Alternatively, you can simply mock the data just as before via Mockito on &lt;em&gt;http-mock-adapter&lt;/em&gt;'s custom adapters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;What problem does &lt;em&gt;http-mock-adapter&lt;/em&gt; solve?&lt;/p&gt;

&lt;p&gt;The problem lies within the nature of the issue - efficient testing.&lt;/p&gt;

&lt;p&gt;Generally speaking, a project might include a lot of code that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Depends on an external service (network, database)&lt;/li&gt;
&lt;li&gt;Takes hefty amount of time to compute&lt;/li&gt;
&lt;li&gt;Depends on many existing entities and conditions within its structure&lt;/li&gt;
&lt;li&gt;Does not satisfy all of the predefined functionality&lt;/li&gt;
&lt;li&gt;May change in the future&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More specifically, in the case of making HTTP requests, is it necessary to send real data to real server and infer real response?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Making a network request takes time.&lt;/strong&gt; It is also not guaranteed that the server will be up and running at all times. Then there are problems with sending too much requests, especially just for the sake of testing some parts of the software.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;http-mock-adapter&lt;/em&gt; aims to solve problems associated with interacting with a real server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;Universally accepted solution for testing resource intensive tasks is &lt;strong&gt;data mocking&lt;/strong&gt;. Mock data is an artificial data used to simulate the workflow of real processes, most often as a part of a software testing initiative.&lt;/p&gt;

&lt;p&gt;In layman's terms - developers/testers mock objects to bypass object's concrete implementations, resulting in custom behavior; for example:&lt;/p&gt;

&lt;p&gt;Suppose we want to test a UI of an application's sign up functionality - we may have to provide registration forms with &lt;em&gt;email&lt;/em&gt; and &lt;em&gt;password&lt;/em&gt;, click the &lt;em&gt;Sign Up&lt;/em&gt; button to signal the application to process user input and then await the result of the registration process in order to render appropriate elements on the screen.&lt;/p&gt;

&lt;p&gt;Provided that the application definitely connects to a remote server for registration purposes and might also include lots of small dependencies (caching user input locally, sending log data to server, etc.) just to successfully send the registration request to the server, - what can go wrong? Numerous undesirable outcomes may occur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Error due to unsupported user input parsing&lt;/li&gt;
&lt;li&gt;Error due to server being down&lt;/li&gt;
&lt;li&gt;Error due to lack of dependency injection (in case that the sign up functionality depends on other entities of the software)&lt;/li&gt;
&lt;li&gt;Having to make new unique user each time you want to run the test&lt;/li&gt;
&lt;li&gt;Having to wait more than it is necessary to test whether or not application's UI works as defined as a result of success/failure/delay of registration&lt;/li&gt;
&lt;li&gt;Sending extra, unnecessary requests to server and slowing it down&lt;/li&gt;
&lt;li&gt;Having to wait a long time for the tests to complete if you have a lot of tests that do not utilize mocking&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Data mocking solves all of the aforementioned problems&lt;/strong&gt; with very simple usage.&lt;/p&gt;

&lt;p&gt;You can instruct the test to create the mock implementation of the real sign up functionality, define custom data, HTTP client, HTTP request &amp;amp; response, and so on, with a logic similar to this: "You want to register new user? I will create a mock object that will generate artificial response of "Successfully registered!" if you send any kind of data to this specific &lt;em&gt;/signup&lt;/em&gt; route!"&lt;/p&gt;

&lt;p&gt;We can demonstrate the ease of use of &lt;em&gt;http-mock-adapter&lt;/em&gt; with intent to return specific response as a reply to a specific request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:dio/dio.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http_mock_adapter/http_mock_adapter.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dio&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dioAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DioAdapter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpClientAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dioAdapter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'https://example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;dioAdapter&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'message'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'Successfully mocked GET!'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'message'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'Successfully mocked POST!'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;onGetResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onGetResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// {"message":"Successfully mocked GET!"}&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;onPostResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onPostResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// {"message":"Successfully mocked POST!"}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With such simple steps, we can instruct &lt;strong&gt;Dio&lt;/strong&gt; (the HTTP client) with our custom &lt;strong&gt;DioAdapter&lt;/strong&gt; (class that exposes developer-friendly methods to mock requests) to mock &lt;strong&gt;GET&lt;/strong&gt; and &lt;strong&gt;POST&lt;/strong&gt; requests aimed at &lt;code&gt;https://example.com&lt;/code&gt; with predefined status codes, data, and more!&lt;/p&gt;

&lt;p&gt;No server issues, blazing fast operations, super easy to use, no worrying about dependencies and implementation details, total control over how we want to test our application based on our needs and preferences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternatively&lt;/strong&gt;, you can use our &lt;code&gt;DioInterceptor&lt;/code&gt; to mock Dio requests with our custom interceptor by adding it inside the &lt;code&gt;dio.interceptors&lt;/code&gt; list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:dio/dio.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http_mock_adapter/http_mock_adapter.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dio&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dioInterceptor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DioInterceptor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;interceptors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dioInterceptor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'https://example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;dioInterceptor&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'message'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'Successfully mocked DELETE!'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onPatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'message'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'Successfully mocked POST!'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;deleteResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deleteResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// {"message":"Successfully mocked DELETE!"}&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;postResposne&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;postResposne&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// {"message":"Successfully mocked POST!"}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; what if you are used to mocking with &lt;a href="https://pub.dev/packages/mockito" rel="noopener noreferrer"&gt;Mockito&lt;/a&gt;? &lt;em&gt;http-mock-adapter&lt;/em&gt; includes mocked version of &lt;code&gt;DioAdapter&lt;/code&gt; ready to be used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:convert'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:dio/dio.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:test/test.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http_mock_adapter/http_mock_adapter.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:mockito/mockito.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Dio&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'DioAdapterMockito'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DioAdapterMockito&lt;/span&gt; &lt;span class="n"&gt;dioAdapterMockito&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;setUpAll&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;dio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dio&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="n"&gt;dioAdapterMockito&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DioAdapterMockito&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpClientAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dioAdapterMockito&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'mocks any request/response via fetch method'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;responsePayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonEncode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;'response_code'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'200'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;responseBody&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResponseBody&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;responsePayload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;headers:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contentTypeHeader&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jsonContentType&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'response_code'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'200'&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

      &lt;span class="k"&gt;when&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dioAdapterMockito&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenAnswer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;responseBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/route'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Regarding the package
&lt;/h2&gt;

&lt;p&gt;The package is being developed on a per-need basis at &lt;a href="https://lomsa.com" rel="noopener noreferrer"&gt;Lomsa&lt;/a&gt;. We could not find a decent Dart package to easily mock HTTP requests, so we decided to make one.&lt;/p&gt;

&lt;p&gt;The package has reached status where it can already be used to mock Dio's requests. We plan to continue working on it and make it even better to use, with additional functionalities, null safety, clean and easy-to-use API, optimized code, integration with other HTTP clients and much more!&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;Data mocking is an important concept that is very useful to know for any developer that is serious about having a thoroughly tested codebase to ensure that the software functions as well as it can.&lt;/p&gt;

&lt;p&gt;We hope that you give &lt;a href="https://pub.dev/packages/http_mock_adapter" rel="noopener noreferrer"&gt;&lt;strong&gt;http-mock-adapter&lt;/strong&gt;&lt;/a&gt; a shot! If you find it useful, please 👍 the package, spread the word, and reach out to us at the &lt;a href="https://github.com/lomsa-dev/http-mock-adapter/issues" rel="noopener noreferrer"&gt;issues' section&lt;/a&gt; if you encounter a bug or think of an awesome feature to improve the package!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>testing</category>
      <category>test</category>
    </item>
  </channel>
</rss>
