title: Flutter Widget testing with HttpClient
body: <p>I am trying to write a widget test for a screen, not the main app. It's my first time writing a widget test and I couldn't find a proper solution for the issue.
  I don't know how to write a proper test for this one. I tried to write a simple widget test and it end up giving me an error as below
  &quot;Warning: At least one test in this suite creates an HttpClient. When
  running a test suite that uses TestWidgetsFlutterBinding, all HTTP
  requests will return status code 400, and no network request will
  actually be made. Any test expecting a real network connection and
  status code will fail.
  To test code that needs an HttpClient, provide your own HttpClient
  implementation to the code under test, so that your test can
  consistently provide a testable response to the code under test.&quot;
  I have just started learning it please help me.
  NOTE: my test was just writing a basic test for finding Text widgets.</p>
  <pre><code>class BookingDetails extends StatefulWidget {
  final booking;
  BookingDetails(this.booking);
  @override
  _BookingDetailsState createState() =&gt; _BookingDetailsState();
  }
  
  class _BookingDetailsState extends State&lt;BookingDetails&gt;
  with AutomaticKeepAliveClientMixin {
  
  Row _buildTeacherInfo(Map&lt;String, dynamic&gt; teacherData) {
  return teacherData != null
      ? Row(
          children: &lt;Widget&gt;[
            CircleAvatar(
              radius: 53,
              backgroundColor: MyColors.primary,
              child: CircleAvatar(
                radius: 50.0,
                backgroundImage: teacherData['user']['img_url'] == null ||
                        teacherData['user']['img_url'] == ''
                    ? AssetImage('assets/images/placeholder_avatar.png')
                    : NetworkImage(teacherData['user']['img_url']),
                backgroundColor: Colors.transparent,
              ),
            ),
            SizedBox(width: 20.0),
            Column(
              children: &lt;Widget&gt;[
                Container(
                  child: Column(
                    children: &lt;Widget&gt;[
                      Text(
                        '${teacherData['user']['first_name']} ',
                        style: AppStyles.textHeader1Style,
                      ),
                      Text(
                        '${teacherData['user']['last_name']}',
                        style: AppStyles.textHeader1Style,
                      ),
                    ],
                  ),
                ),
                ElevatedButton(
                  onPressed: () {
                    //View Profile method
                  },
                  style: ElevatedButton.styleFrom(
                    primary: MyColors.primary,
                    shape: const RoundedRectangleBorder(
                        borderRadius: BorderRadius.all(Radius.circular(25))),
                  ),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    mainAxisSize: MainAxisSize.min,
                    children: &lt;Widget&gt;[
                      Icon(Icons.next_plan_outlined),
                      SizedBox(width: 10.0),
                      Text('VIEW PROFILE'),
                    ],
                  ),
                ),
              ],
            ),
          ],
        )
      : Row(
          children: &lt;Widget&gt;[
            CircleAvatar(
              radius: 48,
              backgroundColor: MyColors.primary,
              child: CircleAvatar(
                radius: 45.0,
                backgroundImage:
                    AssetImage('assets/images/placeholder_avatar.png'),
                backgroundColor: Colors.transparent,
              ),
            ),
            SizedBox(width: 20.0),
            Expanded(
              child: Text(
                'Teacher allocation in progress',
                style: AppStyles.textHeader1Style,
              ),
            )
          ],
        );
    }
  
  Widget _buildBookingDetails(
  Map&lt;String, dynamic&gt; booking,
  List&lt;dynamic&gt; campusData, // one campus' data is an array for some reason.
  Map&lt;String, dynamic&gt; instData,
  ) {
  return Expanded(
    child: Scrollbar(
      child: ListView(
        children: [
          ListTile(
            leading: Icon(Icons.location_on),
            title: Text(
              '${campusData[0]['address_line1']},'
              ' ${campusData[0]['suburb']}, '
              '${campusData[0]['state']} ${campusData[0]['postcode']} ',
              style: AppStyles.textHeader3Style,
            ),
          ),
  }
  
  @override
  Widget build(BuildContext context) {
  super.build(context);
  return FutureBuilder(
    future: Future.wait([_teacherData, _campusData, _classData, _instData]),
    builder: (context, snapshot) =&gt; snapshot.connectionState ==
            ConnectionState.waiting
        ? MyLoadingScreen(message: 'Loading booking data, please wait...')
        : snapshot.hasData
            ? SafeArea(
                child: Container(
                  margin: const EdgeInsets.only(top: 30.0),
                  child: Padding(
                    padding: const EdgeInsets.all(30),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: &lt;Widget&gt;[
                        _buildTeacherInfo(snapshot.data[0]),
                        Divider(color: MyColors.dividerColor),
                        SizedBox(height: 10),
  
                        const SizedBox(height: 10),
                        Divider(
                          color: MyColors.primary,
                          thickness: 1,
                        ),
                        const SizedBox(height: 10),
                        _buildBookingDetails(
                          widget.booking,
                          snapshot.data[1],
                          snapshot.data[3],
                        ),
                        SizedBox(height: 10),
                        Divider(
                          color: MyColors.primary,
                          thickness: 1,
                        ),
                        SizedBox(height: 10),
                        Center(
                          child: widget.booking['cancelled_by_inst'] == true
                              ? Text(
                                  'Canceled',
                                  style: AppStyles.textHeader3StyleBold,
                                )
                              : widget.booking['teacher_id'] == null
                                  ? Center(
                                      child: Text(
                                        'Teacher Allocation in Progress',
                                        style: AppStyles.textHeader3StyleBold,
                                      ),
                                    )
                                  : null,
                        ),
                       }
  </code></pre>