Проблема с имитацией (UserRequester)
Вы не можете смоделировать метод mockSampleService
, поскольку ваш класс создает объект SomeBody
и отличается от SomeBody
объект, который вы создаете в своем тесте.
Теперь у вас есть 2 варианта:
- Используйте
Mockito.any()
в своем тесте, таким образом, вы в основном говорите, что любой ваш метод будет использоватьв качестве параметра вы вернете имитированное поведение - Используйте фабрику, которая при
someString
возвращает вам SomeObject
, например:
// the factory
class SomeObjectFactory{
fun createSomeObject(someString: String): SomeObject {
return SomeObject(someString)
}
}
//the class
class UserRequester(
val service: SampleService, val factory: SomeObjectFactory
) {
fun doGetSomething(someValue: String) {
val response = service.getSomething(factory.createSomeObject(someValue))
// ...
}
}
//the test
class MyTest{
@Test
fun myTestMethod(){
val mockSampleService = mock()
val factory = mock()
val someBody = mock()
val userRequester = UserRequester(mockSampleService, factory)
`when`(factory.createSomeObject(someString)).thenReturn(someBody)
`when`(mockSampleService.getSomething(someBody)).thenReturn(myExpectedValue)
//rest of the code
}
}
Второй подход - самый чистыйone.
Тестирование вызовов Retrofit (SampleService)
Я бы не unit test
вызов Retrofit.
Когда вы работаете с фреймворками,apis, базы данных, общие предпочтения всегда предпочтительнее делать integration tests
вместо unit tests
.
Таким образом вы фактически проверяете, что ваш код работает с внешним миром.
Iпредлагаем вам проверить вызовы дооснащения с помощью MockWebServer (это библиотека из Square
, той же компании, которая разработала OkHttp и Retrofit).
Это read также может быть полезным.