使用Mockito对外部REST API调用进行Android单元测试

使用Mockito对外部REST API调用进行Android单元测试,android,junit,mockito,retrofit2,android-testing,Android,Junit,Mockito,Retrofit2,Android Testing,我是Android中JUnit测试用例的新手。我听说通过使用Mockito我们可以很容易地实现 我的Android类对RESTAPI服务(改型)进行外部调用,该服务返回JSON响应。我必须模拟该响应(硬编码JSON)并编写测试用例 请分享你的想法如何实现这一点 我能够做到 用一段代码更新 class GenerateTripViewModelTest { @Mock private lateinit var mockRepository: GenerateTripReposit

我是Android中JUnit测试用例的新手。我听说通过使用Mockito我们可以很容易地实现

我的Android类对RESTAPI服务(改型)进行外部调用,该服务返回JSON响应。我必须模拟该响应(硬编码JSON)并编写测试用例

请分享你的想法如何实现这一点

我能够做到

用一段代码更新

class GenerateTripViewModelTest {

    @Mock
    private lateinit var mockRepository: GenerateTripRepository

    private val schedulerProvider = SchedulerProvider(Schedulers.trampoline(), Schedulers.trampoline())

    private lateinit var generateTripViewModel: GenerateTripViewModel
    
    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        generateTripViewModel = GenerateTripViewModel(mockRepository, schedulerProvider)
    }

    @Test
    fun SearchSuccessCase() {
        val tripReq = GenerateTripReqModel(ArrayList<String>(),"123","xxxx","xxxx")

        Mockito.`when`(mockRepository.generateTrip(tripReq)).thenReturn(Observable.just(GenerateTripResModel("")))

        val testObserver = TestObserver<GenerateTripResModel>()

        generateTripViewModel.generateTrip(tripReq).subscribe(testObserver)

        testObserver.assertNoErrors()
    }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

class GenerateTripViewModel @Inject constructor(private val generateTripRepository: GenerateTripRepository,private val schedulerProvider: SchedulerProvider) : ViewModel() {
    
    fun generateTrip(reqModel: GenerateTripReqModel) = generateTripRepository.generateTrip(reqModel) 
}
@Singleton
class GenerateTripRepository @Inject constructor(
    private val apiServices: ApiServices, private val context: Context,
    private val appExecutors: AppExecutors = AppExecutors()) {

    /**
     * Generate Trip
     */
    fun generateTrip(reqModel: GenerateTripReqModel): Observable<GenerateTripResModel> = apiServices.generateTrip(reqModel)
}
@Singleton
类GenerateTripPrepository@Inject构造函数(
专用val apiServices:apiServices,专用val上下文:上下文,
私有val appExecutors:appExecutors=appExecutors()){
/**
*生成行程
*/
fun generateTrip(reqModel:GenerateTripReqModel):可观察=apiServices.generateTrip(reqModel)
}
类测试{
@嘲弄
lateinit var redditApiService:redditApiService
lateinit var postSettingsViewModel:postSettingsViewModel
@以前
趣味设置(){
initMocks(本)
postSettingsViewModel=postSettingsViewModel(redditApiService,userRepo)
}
@试验
有趣的{
Mockito.`when`(redditApiService.getSubreddits(“asd”))。然后返回(单
.just(SubredditResponse)(列表(Subreddit(“第一”;))))
//做你的测试
}
}

您可以使用viewmodel或presenter并在那里传递api服务。通过mockito,您可以指定函数调用及其返回值<代码>Mockito.when(api.get())。然后返回(new Result())

您可以查看谷歌示例:

您可以使用产品风格来模拟您的响应或用户MockWebServer库,或者使用从资产返回json的实现替换您的改型接口


upd:我误解了这个问题。我同意Phowner Biring的观点

您能否描述更多,无法理解您的代码。如果可能,您能否分享相关的示例或文章。
class Test{
        @Mock
        lateinit var redditApiService: RedditApiService
        lateinit var postSettingsViewModel: PostSettingsViewModel

        @Before
        fun setUp() {
            initMocks(this)
            postSettingsViewModel = PostSettingsViewModel(redditApiService, userRepo)
        }


        @Test
        fun testApi(){
            Mockito.`when`(redditApiService.getSubreddits("asd")).thenReturn(Single
                .just<SubredditResponse>(SubredditResponse(listOf(Subreddit("first")))))
           //make your tests

        }

    }