Предоставьте все зависимости для объектов @InjectMoks с Mockito, которые не могут обеспечить с @Mock - PullRequest
1 голос
/ 18 февраля 2020

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)
}

Проблемы

  1. Как предоставить 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...