我正在Android Studio上使用Espresso在模拟器上测试我的应用程序的Instrumentation测试。我需要在测试中禁用互联网,以确保当用户没有互联网可用时我的错误处理功能正常工作。我已经搜遍了一个简单的方法,以编程方式从仿真设备禁用互联网。这是我最接近的,这是行不通的。
WifiManager wifiManager = (WifiManager) mActivityRule.getActivity().getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false);
即使在@Before代码块中调用它也不会做任何事情,并且我还在AndroidManifest.xml文件中设置了必要的权限来更改wifi设置。
答案 0 :(得分:1)
通过测试,我们可以轻松地运行没有root访问权限的命令:
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable")
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc data disable")
花点时间找出答案,并提供所有建议过时解决方案的答案和文章(API 29中已弃用wifiManager.setWifiEnabled)
答案 1 :(得分:0)
我最近遇到了类似的问题。我们通过使用依赖项注入解决了它,将逻辑作为依赖项注入。您可以注入WifiManager
服务,由于该服务可能为null,因此风险很小,也可以注入处理逻辑的东西。
为简化Java / Kotlin与所选DI库之间的差异,此解决方案是伪代码:
public class AppHelper {
public boolean isNetworkConnected(Context context) {
// Do your check
return isConnected;
}
}
public class SomeActivity extends Activity {
@Inject
AppHelper appHelper;
private void doNetworkStuff() {
boolean connected = appHelper.isNetworkConnected(this);
// implement your logic
}
}
从那里,您可以模拟或操纵AppHelper
的实例以实现所需的结果。
编辑:出于记录,我不容忍在Activity
中进行网络操作。这只是为了简单地传达想法。