When using hasOneAnnouncement or hasZeroAnnouncements does not check last expectedEvents and events equality.
It means that expecting an AnnounceSemanticsEvent('Hello there', TextDirection.ltr); on SemanticsService.announce('Fetching data', TextDirection.ltr); is ok.
This is due of a wrong condition in the for loop of matches method of _HasSemanticsAnnouncementMatcher class.
Instead of for (int i = 0; i < expectedEvents.length - 1; i++)
do for (int i = 0; i < expectedEvents.length; i++)