Java Android测试:使用私有匿名类验证onClickListener

Java Android测试:使用私有匿名类验证onClickListener,java,android,mockito,robolectric,Java,Android,Mockito,Robolectric,我正在使用Robolectric和Mockito,希望验证异步任务是否已启动。 这是我的密码: AlertDialog.Builder alert = new AlertDialog.Builder(mContext); alert.setTitle(R.string.warning_text); alert.setMessage(message); alert.setPositiveButton(R.string.ok, yesListener); al

我正在使用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();
有谁能说出两者的区别吗

有谁能说出两者的区别吗

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

alert.setPositiveButton(R.string.ok, yesListener);
alert.setNegativeButton(R.string.cancel, noListener);
当click listener被命名为
DriverRokClickListener
,它似乎未被使用时:

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

也许您想要的是
driverOkClickListener
而不是
yesListener

在第一个示例中,您没有
将侦听器设置为对话框:

    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();
        }
    }
};

是的,你的听众应该是yesListener。这是提问时的打字错误