gpt4 book ai didi

android - 如何模拟自动化 Android Studio UI Espresso 测试套件的网络层响应?

转载 作者:行者123 更新时间:2023-11-28 21:17:08 25 4
gpt4 key购买 nike

我的目标是运行一套 Espresso UI 测试,并将在我的 MainActivity 的 onCreate 方法中创建的 Retrofit 实例重新配置为从 localhost< 返回模拟的 JSON 响应,所以我可以测试应用程序的 UI 如何响应响应代码和不同的 JSON 数据等。

到目前为止,我已经尝试放入 MockWebServer 包,并且能够在本地主机服务器上启动并运行它。但是,Retrofit 实例仍然配置为生产 url。

我试过在测试启动时传递参数,包括使用一些 extras 手动设置 MainActivity 的 Intent ,试图设置一个标志来切换用于改造实例。但是,似乎在测试的 @Before 中设置的任何参数都不会在 MainActivity 启动时被拾取。

我看过这些答案,但似乎没有解决方案:

Android Espresso UI Test with mocked Retrofit API

Mock server requests Android Espresso UI Testing

这是我最近的实验:

@get:Rule
var activityRule = ActivityTestRule(MainActivity::class.java, true, false)

@Before
fun setup() {

}

@Test
fun intent() {
val intent = Intent()

activityRule.launchActivity(intent.putExtra("UITesting", true))

println(activityRule.activity.intent.extras)
}

这是 Retrofit 实例:

var BASE_URL = "https://api.invoicehome.com"

class NetworkManager {

private val service : networkService
// initialization with BASE_URL, using Gson converter factory to decode ( i believe there are other options available as well)
init {
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
service = retrofit.create(networkService::class.java)
// }
}
}

MainActivity 的开始,其中有一个 NetworkManager 的实例:

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

private var networkManager = NetworkManager()
}

我想要一些可以简单地环绕 Retrofit 实例并弹出 URL 的东西,但我 99% 确定这不现实。如果任何 swift 开发人员正在关注这个,我正在寻找与 Swifter 类似的功能。

那么,我能否以某种方式使 URL 成为 Retrofit 实例的条件?我将在哪里传递这些标志?是否有我想念的图书馆可以为我完成所有这些工作?

最佳答案

您可以使用 MockWebServer library 的帮助

您需要抽象您的 NetworkManager 类并进行两种不同的实现,一种用于模拟请求,另一种用于发出真实请求并将其作为对您的 Activity 的依赖项提供。

例如:

网络管理器接口(interface)

interface NetworkManager {

fun doRequest()
}

模拟实现

class MockedNetworkManager : NetworkManager {

override fun doRequest() {
// Mock request
}
}

真正的实现

class RealNetworkManager : NetworkManager {

override fun doRequest() {
// Real request
}
}

你的 MainActivity 应该看起来像这样

class MainActivity : AppCompatActivity() {

private lateinit var networkManager: NetworkManager

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val shouldMock = intent.getBooleanExtra("UITesting", false)
if (shouldMock) {
networkManager = MockedNetworkManager()
} else {
networkManager = RealNetworkManager()
}
}

}

关于android - 如何模拟自动化 Android Studio UI Espresso 测试套件的网络层响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com