【发布时间】:2014-07-27 04:30:58
【问题描述】:
在我的应用程序中,单击某个复选框应启用操作栏上的菜单项。当我手动运行应用程序时,这可以正常工作。但是,在检查菜单项的视图时,自动 JUnit/Robotium 测试会失败。
为什么我会在我的测试套件中看到不同的行为?
这里是测试代码:
public class FilterCardsTest extends ActivityInstrumentationTestCase2<FragmentTestActivity> {
public FilterCardsTest() {
super(FragmentTestActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
this.activity = this.getActivity();
this.activity.replaceFragment(new FilterCards());
this.getInstrumentation().waitForIdleSync();
this.solo = new Solo(this.getInstrumentation(), this.activity);
}
public void testBrandCheckBox() {
this.testCheckBox(R.id.brand_check, R.id.brand_input);
}
private void testCheckBox(int checkId, int inputId) {
CheckBox cb = (CheckBox) this.activity.findViewById(checkId);
EditText input = (EditText) this.activity.findViewById(inputId);
this.solo.clickOnView(cb);
this.getInstrumentation().waitForIdleSync();
Assert.assertTrue(input.isEnabled());
Assert.assertTrue(input.hasFocus());
Assert.assertTrue(this.solo.waitForView(R.id.save_menu)); // FilterCardsTest.java:106
}
}
为了测试片段,我创建了一个存根FragmentTestActivity:
public class FragmentTestActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_activity);
}
public void replaceFragment(Fragment fragment) {
this.getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
}
以及设置复选框 onClickListener() 的代码以及启用菜单项的代码:
@Override
public void onPrepareOptionsMenu(Menu menu) {
MenuItem confirm = menu.findItem(R.id.save_menu);
if (this.numberChecked() > 0) {
confirm.setVisible(true);
confirm.setEnabled(true);
} else {
confirm.setVisible(false);
confirm.setEnabled(false);
}
}
private View.OnClickListener onCheckBoxClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText input = null;
for (int i = 0; i < CHECKBOXES.length; i++) {
if (v.getId() == CHECKBOXES[i]) {
input = (EditText) FilterCards.this.getActivity().findViewById(TEXT_FIELDS[i]);
}
}
FilterCards.this.toggleTextField(input);
FilterCards.this.getActivity().supportInvalidateOptionsMenu();
}
};
还有日志猫:
junit.framework.AssertionFailedError
at bbct.android.common.activity.test.FilterCardsTest.testCheckBox(FilterCardsTest.java:106)
at bbct.android.common.activity.test.FilterCardsTest.testBrandCheckBox(FilterCardsTest.java:114)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
【问题讨论】:
-
你能添加确切的错误信息吗?是断言失败吗?还是控制失败?
-
@Rob 感谢您的提醒。我应该更清楚。我还注释了发生断言失败的行。
-
所以大概,它正在等待 20 秒(默认超时)并且保存菜单永远不会出现。你在看这个测试运行,不是吗?存档永远不会出现?前面的两个断言会让您认为触发操作的代码中没有错误.. ?
-
在测试运行期间,保存图标从不出现。但是当我手动运行它时,它确实如此。
-
@Rob 一个想法:
onPrepareOptionsMenu()在Fragment中。为了测试,我有一个FragmentTestActivity将Fragment加载到存根活动中。这可能是我在测试期间和手动执行应用程序期间看到的不同行为的原因。
标签: android unit-testing junit robotium