ЕДИНЦИОННЫЕ Тесты с библиотекой Mockk не удаляются на CI, но каждый раз работает в локальномAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 ЕДИНЦИОННЫЕ Тесты с библиотекой Mockk не удаляются на CI, но каждый раз работает в локальном

Сообщение Anonymous »

Привет, у меня есть несколько модульных тестов для моего мультимодулярного проекта Android, и я хочу запустить конвейер CI с этими тестами, но, как говорится в заголовке, некоторые тесты, которые используют Mockk для насмешливых операций на сервере CI (используя Bitrise для Это с машиной Ubuntu 22.04), но каждый раз в любой ситуации работает на моей локальной машине (MB M1 Pro). Я провел много исследований, но ни один LLM там или какой -либо блог не мог помочь. Для репозиториев, которые также являются тем, почему модуль Im Mosing Usecases): < /p>

Код: Выделить всё

@OptIn(ExperimentalCoroutinesApi::class)
@ExtendWith(MainCoroutineExtension::class)
class DetailViewModelTest {
private lateinit var viewModel: DetailViewModel
private lateinit var getForecastUseCase: GetForecastUseCase
private lateinit var savedStateHandle: SavedStateHandle

@BeforeEach
fun setUp() {
getForecastUseCase = mockk(relaxed = true)
savedStateHandle = SavedStateHandle()
viewModel = DetailViewModel(getForecastUseCase, savedStateHandle)
}

@Test
fun `given viewModel when initialized then forecastState should be Loading`() = runTest {
assertThat(viewModel.forecastState.value).isEqualTo(ForecastState.Loading)
}

@Test
fun `given savedStateHandle with null values when fetching forecast then state should remain Loading`() =
runTest {
savedStateHandle[DetailViewModel.LATITUDE_ARG] = null
savedStateHandle[DetailViewModel.LONGITUDE_ARG] = null

every { getForecastUseCase.execute(any(), any()) } returns flowOf(dummyForecast)

viewModel.forecastState.test {
val firstItem = awaitItem()
assertThat(firstItem).isEqualTo(ForecastState.Loading)
expectNoEvents()
}
}
}

< /code>
GetForecastUseCase
:

Код: Выделить всё

class GetForecastUseCase @Inject constructor(
private val repository: WeatherForecastRepository
) {
fun execute(
lat: String,
long: String
): Flow = repository.getLocationForecast(lat, long)
}

< /code>
(on CI)
Here, first test always succeeds but the second one (which contains mocking operations) always fails with exception :

java.lang.NullPointerException: Cannot invoke
"com.sevban.data.repository.WeatherForecastRepository.getLocationWeather(String,
String)" because "this.repository" is null ...

As you can see its complaining about this.repository being null but the thing is I'm not mocking any repository, I'm only mocking the GetForecastUseCase
класс, который использует репозиторий в качестве зависимости для выполнения запросов в API.
Что я попробовал? ul>
Я проводил повторные тесты тысячи раз, чтобы увидеть, являются ли они Flakky Tests или нет, но они никогда не провалились в моей местной машине. < /p>
< /li> Также я много раз чищал свой кэш Gradle & Android Studio, но они все еще преуспели в локальном, не провалившись в Интернете. < /p>
< /li>
< /ul>
Есть ли какие -либо предложения, которые можно попробовать или это должно быть связано с проблемой о Bitrise? Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/794 ... e-in-local
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»