java - 安卓测试: verify onClickListener using private anonymous class

标签 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);
    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();

谁能告诉我这两者有什么区别吗?

最佳答案

Can any one tell what is the difference between the two?

不确定这是否是问题所在,但在第一个声明中您有 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

关于java - 安卓测试: verify onClickListener using private anonymous class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28806538/

相关文章:

android - 应用样式 Android

android - 限制分享android应用apk

spring-mvc - 如何使用分页测试 Spring MVC Controller ?

scala - 使用原始类型模拟案例类

java - 如何在Spring Boot中用自己的mock替换BeanFactory中的bean?

java - 修改现有 PDF 而不创建新 pdf 文件

java - 如何在类级别注释之前对用@valid注释的属性执行验证?

Java 用户定义的文件属性 View

java - 无法解析符号

java - Android在IntentService中重复运行函数