单元测试在方法内声明的方法

时间:2013-08-09 15:55:57

标签: java android junit

我有一个Android应用程序,其中一个Activity的onCreate()方法内部按钮定义为具有onClick方法。在代码中:

public void onCreate(Bundle savedInstanceState) {
    /.../
        buttonSave = (Button) findViewById(R.id.store_button_save);
        buttonSave.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                saveEditor(v);
            }
        });     
    /.../
}

我的问题是,如何从Android单元测试中调用此嵌套方法onCLick()? myActivity.onClick(myButton)不起作用,因为onClick()不是活动本身定义的方法。

不过,我不应该为我的测试更改任何原始源代码。

2 个答案:

答案 0 :(得分:1)

您可以通过不创建这样的anoynmous类来测试它 而是创建一个普通的内部类,并为侦听器分配一个新实例:

public static class MyClickListener implements OnClickListener {
Editor editor;
public MyClickListener(Editor e) {
   this editor= e;
}
public void onClick(View v) {
  editor.saveEditor(v);
}
}

buttonSave.setOnClickListener(new MyClickListener());

在JuniTest中

    public void testOnClickListener() {
     Editor e = new Editor();
    MyClickListener l = new MyClickListener(e);
    l.onClick();
    // however you check for correct result
    assertTrue(checkSaveEditor(e));

    }

但为什么不只为方法saveEditor()编写unitest? 这已足够,您可以依赖onClick()

答案 1 :(得分:0)

onClick方法是在匿名类中定义的,因此您无法直接调用它。相反,您需要从外部类触发click事件。不太了解Android开发,但以下文章解释了如何使用ActivityManager测试场景,以使用@UIthreadTest注释模拟按钮单击。 How to call Button.performClick in Android JUnit test case?