When running UI tests with hilt, I encounter the exception above. I removed view model and state listener implementations in order to debug properly but to no avail
Class definition
<code>class CustomAuthStateListener(
private val auth: FirebaseAuth
) {}
</code>
<code>class CustomAuthStateListener(
private val auth: FirebaseAuth
) {}
</code>
class CustomAuthStateListener(
private val auth: FirebaseAuth
) {}
View model
<code>@HiltViewModel
class NavHostViewModel @Inject constructor(
authStateListener: CustomAuthStateListener
): ViewModel() {}
</code>
<code>@HiltViewModel
class NavHostViewModel @Inject constructor(
authStateListener: CustomAuthStateListener
): ViewModel() {}
</code>
@HiltViewModel
class NavHostViewModel @Inject constructor(
authStateListener: CustomAuthStateListener
): ViewModel() {}
Screen
<code>@Composable
fun MyNavHost(
viewModel: NavHostViewModel = hiltViewModel()
) {}
</code>
<code>@Composable
fun MyNavHost(
viewModel: NavHostViewModel = hiltViewModel()
) {}
</code>
@Composable
fun MyNavHost(
viewModel: NavHostViewModel = hiltViewModel()
) {}
MainActivity
<code>@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyNavHost(onError = {})
}
}
}
</code>
<code>@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyNavHost(onError = {})
}
}
}
</code>
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyNavHost(onError = {})
}
}
}
Main nav host module
<code>@Module
@InstallIn(SingletonComponent::class)
class NavHostModule {
@Provides
fun provideCustomAuthStateListener(): CustomAuthStateListener =
CustomAuthStateListener(Firebase.auth)
}
</code>
<code>@Module
@InstallIn(SingletonComponent::class)
class NavHostModule {
@Provides
fun provideCustomAuthStateListener(): CustomAuthStateListener =
CustomAuthStateListener(Firebase.auth)
}
</code>
@Module
@InstallIn(SingletonComponent::class)
class NavHostModule {
@Provides
fun provideCustomAuthStateListener(): CustomAuthStateListener =
CustomAuthStateListener(Firebase.auth)
}
Test code
<code>@UninstallModules(NavHostModule::class)
@HiltAndroidTest
class Auth2HomeNavTests {
@get: Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
@get: Rule(order = 1)
val composeRule = createAndroidComposeRule<MainActivity>()
@Module
@InstallIn(SingletonComponent::class)
object NavHostTestModule {
@Singleton
@Provides
fun provideCustomAuthStateListener(): CustomAuthStateListener {
val mockFirebaseAuth = mockk<FirebaseAuth> {
every { currentUser } returns mockk<FirebaseUser> {
every { uid } returns "test_uid"
every { displayName } returns "Test User"
}
}
return CustomAuthStateListener(mockFirebaseAuth)
}
}
</code>
<code>@UninstallModules(NavHostModule::class)
@HiltAndroidTest
class Auth2HomeNavTests {
@get: Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
@get: Rule(order = 1)
val composeRule = createAndroidComposeRule<MainActivity>()
@Module
@InstallIn(SingletonComponent::class)
object NavHostTestModule {
@Singleton
@Provides
fun provideCustomAuthStateListener(): CustomAuthStateListener {
val mockFirebaseAuth = mockk<FirebaseAuth> {
every { currentUser } returns mockk<FirebaseUser> {
every { uid } returns "test_uid"
every { displayName } returns "Test User"
}
}
return CustomAuthStateListener(mockFirebaseAuth)
}
}
</code>
@UninstallModules(NavHostModule::class)
@HiltAndroidTest
class Auth2HomeNavTests {
@get: Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
@get: Rule(order = 1)
val composeRule = createAndroidComposeRule<MainActivity>()
@Module
@InstallIn(SingletonComponent::class)
object NavHostTestModule {
@Singleton
@Provides
fun provideCustomAuthStateListener(): CustomAuthStateListener {
val mockFirebaseAuth = mockk<FirebaseAuth> {
every { currentUser } returns mockk<FirebaseUser> {
every { uid } returns "test_uid"
every { displayName } returns "Test User"
}
}
return CustomAuthStateListener(mockFirebaseAuth)
}
}
Here are versions of the most important dependencies:
Navigation compose – 2.7.7.
fragment-ktx – 1.6.2
hilt – 2.50 (also tried 2.51)
The code does run in a regular debug mode. When I exclude authStateListener parameter from the view model the test also runs