cucumber / cucumber/cucumber-android

Being able to swap out certain dependencies for individual scenarios

Open
#135 2 comments 1 reaction 0 assignees View on GitHub
Dominant language
Kotlin
Stars
146
Forks
60
Avg merge
5d 22h
Merged PRs (30d)
1

Description

### 🤔 What's the problem you're trying to solve?

I have a Hilt integration with Cucumber, and I want to run scenarios with certain "test" versions of some dependencies. Let's say, I have a `CountryRepository` like below:
```
@Module
@InstallIn(SingletonComponent::class)
abstract class CountryModule {

@Binds
abstract fun bindCountryRepository(impl: DefaultCountryRepository): CountryRepository
}

interface CountryRepository {
fun getCountry(): String
}

@Singleton
class DefaultCountryRepository @Inject constructor(): CountryRepository {
override fun getCountry(): String {
return "us"
}
}
```

I'd like to run the following tests:
```
## using DefaultCountryRepository
@wip
Scenario: correct rows are displayed when content is launched in USA
Given app is launched in USA
When user goes to home tab
Then rows are displayed correctly
```
```
## using GermanyRepository
@wip
Scenario: correct rows are displayed when content is launched in Germany
Given app is launched in Germany
When user goes to home tab
Then rows are displayed correctly
```

And my "test" dependency:
```
class GermanyRepository @Inject constructor(): CountryRepository {
override fun getCountry(): String {
return "germany"
}
}
```

It appears that I can't swap `DefaultCountryRepository` with my test repositories on demand in each scenario.

### ✨ What's your proposed solution?

It would be great to allow replacing certain dependencies in each scenarios. Using Hilt without cucumber, I'd be able to do it like this:
```

@UninstallModules(CountryModule::class)
@HiltAndroidTest
class HiltExampleTestWithGermany {

@Module
@InstallIn(SingletonComponent::class)
abstract class CountryModule {

@Singleton
@Binds
abstract fun bindCountryRepository(
repository: GermanyRepository
): CountryRepository
}

@Rule
@JvmField
val hiltRule = HiltAndroidRule(this)
}
```
This way, I could create as many test classes as this, each of them would be isolated from each other. My app would be executed running that specific dependency in my test.

### ⛏ Have you considered any alternatives or workarounds?

No, if there is any way to achieve this that I am not aware of, please advise me.

### 📚 Any additional context?

Generally, I am facing this issue with feature-flagged parts of my app. Some features are enabled in some countries, or based on other configurations. I want to have a better control of those environments in my BDD tests.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.