MockK: ответ не найден, потому что макет изменен извне

#unit-testing #kotlin #junit #mocking #mockk

#модульное тестирование #kotlin #junit #издевательство #mockk

Вопрос:

Привет, коллеги-разработчики,

у меня следующая проблема:

Допустим, у меня есть класс с именем UseCaseX:

 class UseCaseX (private val repository: Repository) {

    override suspend fun invoke(params: Unit?) = repository.call()

}
  

Теперь этот UseCaseX используется в классе ViewModel, например:

     ...
    val result = async { useCaseX.invoke(null) }
    ...
  

Затем я использую MockK для моделирования UseCaseX в ViewModelTest, например:

 val useCaseX = mockk<UseCaseX>(relaxUnitFun = true)
  

И я получаю следующую ошибку:

 io.mockk.MockKException: no answer found for: UseCaseX(#7).invoke(null, continuation {})
at io.mockk.impl.stub.MockKStub.defaultAnswer(MockKStub.kt:90)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:42)
  

Таким образом, очевидно UseCaseX.invoke(params) , что функция расширяется во async{} время с дополнительным параметром, и пока на него нет ответа.

Вопрос: как я могу предоставить ответ для макета в этом случае?

Ответ №1:

используйте withContext(Dispatchers.Default) вместо async . Должно сработать!