package com.patloew.rxlocation; import android.app.Activity; import android.content.Intent; import android.content.IntentSender; import com.google.android.gms.common.api.Status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareOnlyThisForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.util.UUID; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.spy; @RunWith(PowerMockRunner.class) @PrepareOnlyThisForTest({ SettingsCheckHandleSingleOnSubscribe.class, Status.class }) public class LocationSettingsActivityTest { @Mock Status status; @Mock Intent intent; LocationSettingsActivity activity; final String observableId = UUID.randomUUID().toString(); @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); PowerMockito.spy(SettingsCheckHandleSingleOnSubscribe.class); activity = spy(new LocationSettingsActivity()); doReturn(observableId).when(intent).getStringExtra(LocationSettingsActivity.ARG_ID); doReturn(status).when(intent).getParcelableExtra(LocationSettingsActivity.ARG_STATUS); doReturn(intent).when(activity).getIntent(); } @Test public void onCreate() { activity.onCreate(null); doAnswer(invocation -> null).when(activity).handleIntent(); verify(activity).handleIntent(); } @Test public void onNewIntent() { activity.onNewIntent(intent); doAnswer(invocation -> null).when(activity).handleIntent(); verify(activity).setIntent(intent); verify(activity).handleIntent(); } @Test public void handleIntent() throws IntentSender.SendIntentException { activity.handleIntent(); verify(status).startResolutionForResult(activity, LocationSettingsActivity.REQUEST_CODE_RESOLUTION); } @Test public void handleIntent_SendIntentException() throws IntentSender.SendIntentException { doThrow(new IntentSender.SendIntentException()).when(status).startResolutionForResult(activity, LocationSettingsActivity.REQUEST_CODE_RESOLUTION); activity.handleIntent(); } @Test public void onActivityResult() { activity.onActivityResult(LocationSettingsActivity.REQUEST_CODE_RESOLUTION, Activity.RESULT_OK, null); verify(activity).setResolutionResultAndFinish(Activity.RESULT_OK); } @Test public void onActivityResult_wrongRequestCode() { activity.onActivityResult(-123, Activity.RESULT_OK, null); verify(activity).setResolutionResultAndFinish(Activity.RESULT_CANCELED); } @Test public void setResolutionResultAndFinish_OK() { activity.setResolutionResultAndFinish(Activity.RESULT_OK); PowerMockito.verifyStatic(); SettingsCheckHandleSingleOnSubscribe.onResolutionResult(observableId, Activity.RESULT_OK); verify(activity).finish(); } @Test public void setResolutionResultAndFinish_Canceled() { activity.setResolutionResultAndFinish(Activity.RESULT_CANCELED); PowerMockito.verifyStatic(); SettingsCheckHandleSingleOnSubscribe.onResolutionResult(observableId, Activity.RESULT_CANCELED); verify(activity).finish(); } }