Senario
Я собираюсь проверить свою активность с AndroidUnittest и Mockito . У меня есть два класса, которые хотят издеваться над Мокито . (На самом деле мне плевать на эти два класса, я просто хочу издеваться над ними и видеть взаимодействие действий с ними). Один - viewModel , а другой - SomeManager . Оба имеют сложные зависимости, которые в конечном итоге требуют контекста, который предоставляет все зависимости, предоставляемые кинжалом. У некоторых из них есть модуль, а у некоторых - конструктор. Я просто делюсь своей ViewModel, и если я могу найти решение, оно также будет работать для моего менеджера.
class HomeActivityViewModel @Inject
internal constructor(
@Named("io") val dispatcher: CoroutineDispatcher,
private val navigationDrawerManager: NavigationDrawerManager,
private val userAccountManager: UserAccountManager, //Needs context
private val tokenManager: TokenManager, //Needs context
private val context: Context,
private val authRepository: AuthRepository, //It is a interface that Impl provided by dagger
private val retrofit: Retrofit,
private val userInformationRepository: UserInformationRepository
) : ObservableViewModel(), CoroutineScope {
И это в тестовом классе:
@InjectMocks
lateinit var mockViewModel: HomeActivityViewModel
//All needed in viewModel
@InjectMocks
lateinit var navigationDrawerManager: NavigationDrawerManager
@InjectMocks
lateinit var userAccountManager: UserAccountManager
@InjectMocks
lateinit var tokenManager: TokenManager
@Mock
lateinit var authRepository: AuthRepository
...
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
}
Проблемы
- Как предоставить Context
Я предоставил все сложные объекты (My viewModel и Manager) на @InjectMocks
и простые зависимости на @Mock
Но в конце концов я Нужен контекст, который, я думаю, не может предоставить Mockito . Поэтому я не знаю, как я могу предоставить контекст для этих @Mock
аннотаций. Я просто положил
val context: Context = InstrumentationRegistry.getInstrumentation().context
, но не знаю, как я могу выставить это для Mockito проводов в
Как предоставить некоторые пользовательские фиктивные объекты
@Mock
или
@InjectMocks
аннотированным объектам
Также некоторые классы не могут быть смоделированы как: Модификация. Поэтому я должен создать макет и перейти к тому объекту, который нуждается в качестве зависимостей. (Аннотировано @Mock или @InectMocks) Но я не знаю как ?! Например, если я готовлю Retrofit следующим образом:
var okHttpClient = OkHttpClient()
var retrofit: Retrofit = RetrofitBuilderFactory.createRetrofit(okHttpClient)
Как я могу выставить их для потребления элементами @Mock или @InjectMock?