— Dart, Flutter, Issues — 1 min read
Recently, I encountered an issue while upgrading Flutter and some outdated packages in one of my projects. Specifically, after upgrading the firebase_analytics
package, I faced problems with some of my unit tests. In this article, I will share the steps I took to troubleshoot and resolve this issue.
Upon upgrading the firebase_analytics
package, I noticed that my previously functioning unit tests were now failing. It appeared that changes had been made to the package since my last update, leading to compatibility issues. Although I couldn't pinpoint the exact cause, I observed that any attempts to make calls that would send events resulted in an error message instructing me to initialize the library, even though initialization did not resolve the issue. The specific error message I encountered was as follows:
1[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
To solve the problem, I decided to create a mock for the AnalyticsUtil
class using the mockito
package, which I had used previously to mock navigation in a unit test (as discussed in my previous article here). But this time I didn't need to use any code generation.
In my project I had a simple AnalyticsUtil
class, which I used in conjunction with riverpod
. The class looked like this:
1import 'package:firebase_analytics/firebase_analytics.dart';2import 'package:logger/logger.dart';3
4class AnalyticsUtil {5 final _logger = Logger();6
7 void logEvent({8 required String name,9 Map<String, dynamic>? parameters,10 }) {11 _logger.d('Sending analytics event: $name');12 if (parameters != null) {13 FirebaseAnalytics.instance.logEvent(14 name: name,15 parameters: parameters,16 );17 } else {18 FirebaseAnalytics.instance.logEvent(19 name: name,20 );21 }22 }23}
The specifics of integrating this class with riverpod
are beyond the scope of this article, I'll focus on the solution to the firebase_analytics
upgrade issue.
To create a mock for the AnalyticsUtil
class, follow these steps:
mockito
package._AnalyticsMock
, which extends Mock
from mockito
, and overrides the logEvent
method as follows:1import 'package:mockito/mockito.dart';2
3class _AnalyticsMock extends Mock implements AnalyticsUtil {4 @override5 void logEvent({required String name, Map<String, dynamic>? parameters}) {}6}
_AnalyticsMock
to use in place of the actual AnalyticsUtil
class:1final analytics = _AnalyticsMock();
By utilizing the mock class in your tests or injecting it into other classes, you can avoid encountering issues when calling logEvent
within your view models or elsewhere. And off you go - you won't have any issues anymore if you are calling logEvent
somewhere in your view models etc.