测试互联网连接不可用时的警报显示roboelectric android

测试互联网连接不可用时的警报显示roboelectric android,android,eclipse,junit4,robolectric,Android,Eclipse,Junit4,Robolectric,我正在使用Roboelectric测试一个简单的android应用程序。它有一个活动,有一个按钮,点击按钮,无论我是否连接到internet,它都会显示一条警告消息。我正在使用ConnectivityManager并检查WiFi或Mobile网络的可用性 这是按钮的onClick方法 netButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { if(isConnec

我正在使用
Roboelectric
测试一个简单的
android
应用程序。它有一个活动,有一个按钮,点击按钮,无论我是否连接到internet,它都会显示一条警告消息。我正在使用
ConnectivityManager
并检查
WiFi
Mobile
网络的可用性

这是按钮的onClick方法

 netButton.setOnClickListener(new OnClickListener(){
 @Override
 public void onClick(View v) {
 if(isConnectedToInternet()){
 new AlertDialog.Builder(MainActivity.this).setMessage("You are connected to internet").setNeutralButton("OK", new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int which) {
         dialog.cancel();
     }
 }).show();
 }
 else{
 new AlertDialog.Builder(MainActivity.this).setMessage("You are not connected to internet").setNeutralButton("OK", new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int which) {
     dialog.cancel();
 }
}).show();
}
}
});
isconnectedPointerNet
方法如下-

public boolean isConnectedToInternet(){
connManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiNetwork =connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobileNetwork = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifiNetwork!=null && wifiNetwork.isConnected()){
return true;
else if (mobileNetwork!=null && mobileNetwork.isConnected()){
return true;
return false;
}
应用程序运行良好。此外,当我使用
Roboelectric
运行它,并手动将连接类型设置为
移动或WiFi
以测试是否显示警报时,测试和断言运行正常。但是如果我将类型设置为任何
other
类型(比如WIMAX或不属于任何类型0x0000000A的常数),它总是映射到类型
Mobile
(常数0x00000000)

下面是我的代码,用于检查internet不可用和警报消息的显示

'MainActivityTest.java'

    public void testAlertForNonNetwork(){
    setUpActivity();

    connManager=(ConnectivityManager)Robolectric.application.getSystemService(Context.CONNECTIVITY_SERVICE);
    ShadowConnectivityManager sConnManager=Robolectric.shadowOf_(connManager);
    sConnManager.setNetworkInfo(0x0000000A,sConnManager.getActiveNetworkInfo());
    pushSecondButton();
    AlertDialog alert=ShadowAlertDialog.getLatestAlertDialog();
    assertNotNull("the alert is null",alert!=null);
    ShadowAlertDialog sAlert=shadowOf_(alert);
    assertNotNull("the salert is null",sAlert!=null);
    assertThat(sAlert.getMessage().toString(),equalTo("You are not connected to internet"));
    }
这里的
setUpActivity
pushSecondButton
是设置活动和按下按钮的简单方法

 netButton.setOnClickListener(new OnClickListener(){
 @Override
 public void onClick(View v) {
 if(isConnectedToInternet()){
 new AlertDialog.Builder(MainActivity.this).setMessage("You are connected to internet").setNeutralButton("OK", new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int which) {
         dialog.cancel();
     }
 }).show();
 }
 else{
 new AlertDialog.Builder(MainActivity.this).setMessage("You are not connected to internet").setNeutralButton("OK", new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int which) {
     dialog.cancel();
 }
}).show();
}
}
});
这种断言总是失败的。有趣的是,如果我在检查移动数据连接的
MainActivity.java
中对代码进行注释,那么我的断言将成功运行

有人知道吗,为什么RoboeElectric会将任何其他连接映射到移动设备,如果我使用
ConnectivityManager.WIMAX
而不是MainActivityTest中的常量
0x0000000A
,这种行为是可以复制的

我尝试使用
System.out.println(xxxNetwork.getType())
以及WiFi和Mobile以外的任何类型映射到
Mobile,常量0
,来显示该值

    if (hasConnection()) {

//write your code
}
else{
Open_dilog();
}


//Method of Open_dilog()


private void Open_dilog() {
        // TODO Auto-generated method stub

        AlertDialog.Builder builder = new AlertDialog.Builder(
                Sharing_activity.this);
        builder.setTitle("Title name");
        builder.setMessage("No Internet Connection Available.");
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                dialog.dismiss();

            }
        });
        AlertDialog dialog_show = builder.create();
        dialog_show.show();

    }
公共静态布尔连接(){ ConnectivityManager cm=(ConnectivityManager)this.getContext().getSystemService( 连接(U服务)


}我无法重现您提到的错误,返回类型为mobile的错误内容。当我查询ShadowConnectivityManager时,任意类型(包括
TYPE_WIMAX
和int 35)返回null。这是我所期望的行为,令人欣慰

至于您的测试失败的原因,我认为这是因为默认情况下Robolectric添加了
TYPE\u WIFI
TYPE\u MOBILE
NetworkInfo
。看见默认设置为手机已连接,wifi已断开。我不知道这是为什么。以下是相关代码:

  public ShadowConnectivityManager() {
    NetworkInfo wifi = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.DISCONNECTED, ConnectivityManager.TYPE_WIFI, 0, true, false);
    networkTypeToNetworkInfo.put(ConnectivityManager.TYPE_WIFI, wifi);

    NetworkInfo mobile = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_MOBILE_MMS, true, true);
    networkTypeToNetworkInfo.put(ConnectivityManager.TYPE_MOBILE, mobile);

    this.activeNetwork = mobile;
  }
在您的测试中,我会首先设置我期望的
NetworkInfo
。在您的情况下,这将设置wifi和手机断开连接

我还建议使用命名的int而不是它们的原始值,例如
TYPE_WIMAX
而不是
0x0000000A
或映射到的任何常量。这将使它更易于阅读和维护

编辑:

评论中的空间不足。为了修复测试,我首先要确保在每个测试开始时,您的系统处于已知状态。看起来,你正试图这么做,但被机器人在默认情况下的扑通声所阻碍。因此,在您的
@Before
方法中(或者
setUp()
或者如果您使用的是JUnit 3,那么类似的
@Before
方法是什么),我会将移动值设置为disconnected。当然,你也可以在每次测试的基础上做这件事——任何最有意义的事情

在我的
@Before
方法中,我使用
ShadowConnectivityManager
表示移动设备已断开连接,然后我断言在单个测试中确实如此。我从未在自己的测试中使用过这个,因此您可能需要稍微修改一下,以确保
newInstance()
的所有参数都是正确的。例如,我不知道哪个参数优先——第一个参数还是最后一个参数,所以如果你说
DetailedState.CONNECTED
和最后一个参数
false
我不知道
isConnected()
会返回什么

我可以保证,在我当前的设置中,此测试通过,如果我删除对
setNetworkInfo()
的调用,则会失败

您可能还希望将
ConnectivityManager
对象移动到一个类字段,以保持整洁,这看起来就像您已经在代码中完成了一样。当然,如果您走这条路线,请确保在测试之间重置任何必要的状态

  @Before
  public void before() {

    ConnectivityManager cm = (ConnectivityManager)
        Robolectric.application.getSystemService(Context.CONNECTIVITY_SERVICE);

    ShadowConnectivityManager shadowCM = Robolectric.shadowOf(cm);

    shadowCM.setNetworkInfo(
        ConnectivityManager.TYPE_MOBILE,
        ShadowNetworkInfo.newInstance(
            DetailedState.DISCONNECTED,
            ConnectivityManager.TYPE_MOBILE,
            ConnectivityManager.TYPE_MOBILE_MMS,
            true,
            false));


  }

  @Test
  public void mobileIsDisconnected() {
    ConnectivityManager cm = (ConnectivityManager)
        Robolectric.application.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo mobileInfo =
        cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    assertThat(mobileInfo.isConnected()).isFalse();
  }

谢谢你的回答,但你给了我一个不同的代码来检查互联网的可用性,我检查可用性的方式也没有错。我的问题不同。这是在使用RoboeElectric。如果,默认设置是手机已连接,wifi已断开,这不是错吗?此外,我不明白如何将wifi和手机设置为断开连接?这是我设置WIMAX类型或任何其他常量的唯一原因。我说不出为什么这些默认值是在Robolectric中设置的。通常,他们这样做是为了以某种方式反映Android代码。这可能是为了方便。例如,从中可以看出,返回null表示设备不支持该网络类型。在这种情况下提供一些合理的违约对我来说是有意义的。我没有空间,因此将编辑答案,并提供更新测试的更多详细信息。很高兴提供帮助。如果这回答了你的问题,你能选择它作为正确的回答吗?如果没有,还有什么尚不清楚?