在Android Studio上使用模拟器和Espresso测试互联网连接错误处理。

13
我正在为我的Android Studio应用编写仪器测试,使用Espresso在模拟器上进行测试。我需要在测试中禁用网络,以确保当用户没有可用的网络时,我的错误处理功能能够正常工作。我已经在各个地方搜索了一个简单的方法来以编程方式禁用模拟设备上的网络,但是没有找到合适的方法。
        WifiManager wifiManager = (WifiManager) mActivityRule.getActivity().getSystemService(Context.WIFI_SERVICE);
        wifiManager.setWifiEnabled(false);

即使在@Before代码块中调用此方法也没有任何作用,而且我还在AndroidManifest.xml文件中设置了必要的权限来更改WiFi设置。

你找到解决方案了吗?我也在想同样的问题。我认为你需要在AndroidManifest中提供权限... - IgorGanapolsky
2个回答

13

通过测试,我们可以轻松地在没有root权限的情况下运行命令:

InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc wifi disable")
InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("svc data disable")

花费了一些时间才找到答案,因为许多答案和文章提供的解决方案已经过时了(wifiManager.setWifiEnabled在API 29中已被弃用)。

3
好的,只需两行代码,你就可以完成所有设置。回答很好,谢谢!请记得在测试方法结束时将其重新启用。 - qki

0

我最近遇到了类似的问题。我们通过使用依赖注入来解决它,将逻辑作为依赖注入。您可以注入WifiManager服务,但这样稍微有点风险,因为它可能为空,或者您可以注入处理逻辑的其他内容。

为了简化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中进行网络操作。这只是为了简单地传达思想。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接