Search code examples
junitswitch-statementandroidjunit3

How to click on Switch in Android Junit Test?


I used the below code to checked and unchecked on Switch component of Android. How to checked-unchecked on Switch by touch utility in Android Junit Testing?

        // wait 2 seconds for the start of the activity
    final FinalizeCalibrationActivity finalActivity = (FinalizeCalibrationActivity) monitorFinalActivity
            .waitForActivityWithTimeout(2000);
    assertNotNull("FinalizeCalibrationActivity is null", finalActivity);

    final Switch swtSignedRdwPortal = (Switch) finalActivity
            .findViewById(R.id.swt_signed_rdw_portal);

    JunitUtils.waitTime(3);
    swtSignedRdwPortal.setChecked(false);

    JunitUtils.waitTime(3);
    swtSignedRdwPortal.setChecked(true);

Solution

  • We cannot used Switch view directly. It will throw failed assertions like: "android-only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-views".

    I've used rewrite the code like this,

    // wait 2 seconds for the start of the activity
        final FinalizeCalibrationActivity finalActivity = (FinalizeCalibrationActivity) monitorFinalActivity
                .waitForActivityWithTimeout(2000);
        assertNotNull("FinalizeCalibrationActivity is null", finalActivity);
    
        final Switch swtSignedRdwPortal = (Switch) finalActivity
                .findViewById(R.id.swt_signed_rdw_portal);
    
        JunitUtils.waitTime(3);
        finalActivity.runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                swtSignedRdwPortal.setChecked(false);
            }
        });
    
        JunitUtils.waitTime(3);
        finalActivity.runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                swtSignedRdwPortal.setChecked(true);
            }
        });
    

    This is working fine for me in Android Junit Test.!!!