如何在Android中测试一个线源?

时间:2012-09-14 08:21:37

标签: android unit-testing junit-ee

我必须进行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);
                                }
                            }
                       )
                }
        }
  }

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

感谢您的时间。

1 个答案:

答案 0 :(得分: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

但是,模拟匿名内部类很难,所以你可能不得不以某种方式重构。至于访问提供字段和方法--jmockit提供了直接类 Deencalsulation - 它忽略了几乎所有的访问约束。