0

我必须进行 Android Junit 测试。来源就像这样:

public class A extends Activity{

    private classB mB;
    private int mType = 2; 

    somebutton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                       mB.showDialog(
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                 //next line is the modified and I have to make test file                               
                                  mB.setType(mType);
                                }
                            }
                       )
                }
        }
  }

我可以让测试点击按钮并准备所有其他需要的东西,但我想如何断言True?并且没有“getType()”,“mB”中的“Type”是私有的。

感谢您的时间。

4

1 回答 1

0

在 android 上进行单元测试很困难,因为所有的 SDK 类都被存根,并且只适用于重新编译它们,并且在设备或模拟器上运行单元测试是 PITA

另一种选择是嘲笑。[最] 合适的模拟框架是 JMockit(它可以模拟最终私有静态 - 也可以模拟你梦寐以求的一切)

这是一个小例子,展示了 jmockit 对 android 类的使用:

/**
 * shall inject assignable views   into
 */
@Test
public void testSimpleInjection(@Mocked final WithInjectableViews injectable,
                                @Mocked final TextView textView,
                                @Mocked final Button button) {

    new Expectations() {
        {
            injectable.findViewById(239);
            returns(textView);


            injectable.findViewById(555);
            returns(button);


        }
    };

    ViewInjector.startActivity(injectable);

    assertEquals(textView, Deencapsulation.getField(injectable, "asView"));
    assertEquals(button, Deencapsulation.getField(injectable, "button"));
    assertNull(Deencapsulation.getField(injectable, "notInjected"));

}


class WithInjectableViews extends Activity {
    // shall be injected
    @InjectView(id = 239)
    private android.view.View asView;
    @InjectView(id = 555)
    private Button button;
    // shall be left alone
    private View notInjected = null;

}

(完整来源:https ://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java )

但是,模拟匿名内部类很困难,因此您可能必须以某种方式进行重构。至于对 provate 字段和 mewthods 的访问——jmockit 提供了直到类Deencalsulation——它忽略了几乎所有的访问约束。

于 2012-09-14T09:10:06.920 回答