问题描述
我正在尝试使用 Espresso
和 MockWebServer
为我的 Fragment 编写 UI 测试。我正在使用 OkHttp Idling Resource
告诉 Espresso 等待 API 调用完成。
但不知何故,有时我的测试有效但有时无效,因为 Espresso
在服务请求之前完成它的工作。所以我的 recyclerView 项目点击测试失败。
我不明白为什么 espresso 不等待 API 调用?有人可以帮忙吗?
这是我的测试课@H_502_16@
@MediumTest
@HiltAndroidTest
@UninstallModules(PersistenceModule::class,NetworkModule::class)
class MainFragmentTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
private val mockWebServer = MockWebServer()
@Inject
lateinit var okHttp3IdlingResource: OkHttp3IdlingResource
@Before
fun setUp() {
hiltRule.inject()
// Prepare Mock Web Server
mockWebServer.start(8080)
IdlingRegistry.getInstance().register(okHttp3IdlingResource)
}
@Test
fun mainFragmenttest(){
// Prepare Mock Web Server
mockWebServer.dispatcher = object : dispatcher() {
override fun dispatch(request: RecordedRequest): MockResponse {
return MockResponse()
.setResponseCode(200)
.setBody(MockResponseFileReader("post_success.json").content)
}
}
val navController = mockk<NavController>(relaxed = true)
launchFragmentInHiltContainer<MainFragment> {
Navigation.setViewNavController(requireView(),navController)
}
onView(withId(R.id.rv_posts)).perform(
RecyclerViewActions.actionOnItemAtPosition<PostViewHolder>(
0,click()
)
)
verify { navController.navigate(MainFragmentDirections.actionMainFragmentToDetailFragment().setPost(any())) }
}
@After
fun tearDown() {
mockWebServer.close()
}
}
这是我的 TestNetworkModule
保存网络依赖项@H_502_16@
@Module
@InstallIn(SingletonComponent::class)
object TestNetworkModule {
/**
* Provides [OkHttpClient] instance
*/
@Provides
@Singleton
fun provideOkHttpClient() : OkHttpClient {
return OkHttpClient.Builder()
.connectTimeout(30,TimeUnit.SECONDS)
.writeTimeout(30,TimeUnit.SECONDS)
.readTimeout(30,TimeUnit.SECONDS)
.build()
}
/**
* Provides [OkHttp3IdlingResource] instance
*/
@Provides
@Singleton
fun provideIdlingResource(okHttpClient: OkHttpClient) : OkHttp3IdlingResource {
return OkHttp3IdlingResource.create(
"okhttp",okHttpClient
)
}
/**
* Provides [Retrofit] instance
*/
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient) : Retrofit {
val contentType = "application/json".toMediaType()
return Retrofit.Builder()
.baseUrl("http://127.0.0.1:8080")
.client(okHttpClient)
.addConverterFactory(Json.asConverterFactory(contentType))
.build()
}
/**
* Provides [ApiService] instance
*/
@Provides
@Singleton
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}
我不知道我错过了什么,所以任何帮助将不胜感激
当前版本;
androidTestImplementation "com.squareup.okhttp3:mockwebserver:4.6.0"
androidTestImplementation 'com.jakewharton.espresso:okhttp3-idling-resource:1.0.0'
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)