i want click on alertdialog
in activityinstrumentationtestcase2
. dialoginterface.onclicklistener()
execute, after test finished , not during test (i know that, because debugged test).
my test checks delete button. if delete button pressed, alertdialog
appear , ask user again. if user accepts alertdialog
, database row deleted.
public class shifttest2 extends activityinstrumentationtestcase2<shift> { @uithreadtest public void testdeletebutton() { shift shift = getactivity(); button deletebutton = (button) shift.findviewbyid(r.id.shift_delete); deletebutton.performclick(); // works fine alertdialog alertdialog = shift.getalertdialog(); // thread execute performclick() after test finished alertdialog.getbutton(dialoginterface.button_positive).performclick(); final bundle savedshift = mdb.getshiftbyid("1"); assertnull(savedshift); // assert fail } }
the onclicklistener
delete button.
public void ondeletebutton(view view) { if (mdeletedialog != null) { malert = mdeletedialog.create(); malert.show(); } }
and here listeners alertdialog
.
@override public void oncreate(bundle savedinstancestate) { ... mdeletedialog = new alertdialog.builder(this); mdeletedialog.setmessage(getstring(r.string.delete_shift_really)); mdeletedialog.setpositivebutton(getstring(r.string.delete), new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialoginterface, int i) { mdb.deleteshift(mid); resetallpreferences(); intent parentactivity = new intent(context, workingtimesettings.class); startactivity(parentactivity); } }); mdeletedialog.setnegativebutton(getstring(r.string.cancel), new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialoginterface, int i) { // nothing here } }); }
i tried thread.sleep(10000)
in test, changes nothing. problem is, thread don't jump out of test execute positive button listener. perhaps because of @uithreadtest
annotation?
i solve problem myself. @uithreadtest
annotation. run critical parts in method shift.runonuithread()
.
public void testdeletebutton() { final shift shift = getactivity(); final button deletebutton = (button) shift.findviewbyid(r.id.shift_delete); final int deletebuttonviewmode = deletebutton.getvisibility(); assertequals(view.visible, deletebuttonviewmode); shift.runonuithread(new runnable() { @override public void run() { deletebutton.performclick(); shift.getalertdialog().getbutton(dialoginterface.button_positive).performclick(); } }); getinstrumentation().waitforidlesync(); final bundle savedshift = mdb.getshiftbyid("1"); assertnull(savedshift); }
hint: have removed annotation other tests, too. otherwise not green.