我必须进行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”是私有的。
感谢您的时间。
答案 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;
}
但是,模拟匿名内部类很难,所以你可能不得不以某种方式重构。至于访问提供字段和方法--jmockit提供了直接类 Deencalsulation - 它忽略了几乎所有的访问约束。