【问题标题】:Android testing: verify onClickListener using private anonymous classAndroid 测试:使用私有匿名类验证 onClickListener
【发布时间】:2023-03-08 07:18:01
【问题描述】:

我正在使用 Robolectric 和 Mockito,并想验证异步任务是否已启动。 这是我的代码:

    AlertDialog.Builder alert = new AlertDialog.Builder(mContext);
    alert.setTitle(R.string.warning_text);
    alert.setMessage(message);
    alert.setPositiveButton(R.string.ok, yesListener);
    alert.setNegativeButton(R.string.cancel, noListener);
    alert.show();

private DialogInterface.OnClickListener yesListener = new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int i) {
        startAsyncTask();
    }
};

这是我的测试用例

AlertDialog warningDialog = ShadowAlertDialog.getLatestAlertDialog();
Assert.assertTrue(warningDialog.isShowing());
warningDialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
verify(mySpy).startAsyncTask();

测试在验证时失败并出现“通缉但未调用”错误。但是 onClick 方法确实会触发。

但是当像下面这样定义监听器时,它可以工作

AlertDialog.Builder alert = new AlertDialog.Builder(mContext);
alert.setTitle(R.string.warning_text);
alert.setMessage(message);
alert.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialogInterface, int i){
        startAsyncTask();
    }
});

alert.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialogInterface, int i){
        dialogInterface.dismiss();
    }
});
alert.show();

谁能说出两者的区别?

【问题讨论】:

    标签: java android mockito robolectric


    【解决方案1】:

    谁能说出两者的区别?

    不确定这是否是问题,但在第一个声明中您有 yesListenernoListener

    alert.setPositiveButton(R.string.ok, yesListener);
    alert.setNegativeButton(R.string.cancel, noListener);
    

    虽然点击监听器被命名为driverOkClickListener,但它似乎未被使用:

    private DialogInterface.OnClickListener driverOkClickListener = new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int i) {
            startAsyncTask();
        }
    };
    

    或许您想要driverOkClickListener 而不是yesListener

    【讨论】:

    • 是的,driverOkClickListener 应该是 yesListener。这是提问时的拼写错误
    【解决方案2】:

    在您的第一个示例中,您没有 set 对话的听众:

        AlertDialog.Builder alert = new AlertDialog.Builder(mContext);
        alert.setTitle(R.string.warning_text);
        alert.setMessage(message);
        alert.setPositiveButton(R.string.ok, driverOkClickListener);
        alert.setNegativeButton(R.string.cancel, driverOkClickListener);
        alert.show();
    
    ...
    
    private DialogInterface.OnClickListener driverOkClickListener = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (which == DialogInterface.BUTTON_POSITIVE) {
                startAsyncTask();
            } else {
                dialogInterface.dismiss();
            }
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多