@Test
 public void shouldExitDummyActivityContextAfterInjectingTestSubject() {
   testFieldInjector.setupTestCase();
   InOrder inOrder = inOrder(roboUtils);
   inOrder.verify(roboUtils).enterContext(any(FragmentActivity.class));
   inOrder.verify(roboUtils).exitContext(any(FragmentActivity.class));
 }
 @Test
 public void shouldSetupGuiceBindingsBeforeEnteringContextAndGettingInjector() {
   testFieldInjector.setupTestCase();
   InOrder inOrder = inOrder(roboUtils);
   inOrder.verify(roboUtils).setGuiceModules(isA(TestFieldInjector.BindingsForMocksModule.class));
   inOrder.verify(roboUtils).enterContext(any(Context.class));
   inOrder.verify(roboUtils).getInjector(any(Context.class));
 }
 @Test
 public void shouldEnterIntoNewContextOnlyAfterExitingOutOfDummyActivityContext() {
   testFieldInjector.setupTestCase();
   InOrder inOrder = inOrder(roboUtils);
   inOrder.verify(roboUtils).enterContext(any(FragmentActivity.class));
   inOrder.verify(roboUtils).exitContext(any(FragmentActivity.class));
   inOrder.verify(roboUtils).enterContext(any(FragmentActivity.class));
 }
 @Test
 public void shouldUseFragmentTransactionToAddFragmentToDummyActivityIfSubjectIsAnFragment() {
   when(testCase.getTestSubjectClassType()).thenReturn(RoboFragment.class);
   when(reflectionUtils.classIsOfAssignableForm(RoboFragment.class, RoboFragment.class))
       .thenReturn(true);
   when(reflectionUtils.createObjectProxy(RoboFragment.class, testFieldInjector))
       .thenReturn(fragment);
   when(reflectionUtils.objectIsOfAnyType(fragment, RoboFragment.class)).thenReturn(true);
   testFieldInjector.setupTestCase();
   TestFragmentManager fragmentManager =
       (TestFragmentManager)
           shadowOf((FragmentActivity) testFieldInjector.getCurrentContextForTest())
               .getSupportFragmentManager();
   assertThat(fragmentManager.getCommittedTransactions().size(), is(1));
   assertThat(
       (RoboFragment) fragmentManager.getCommittedTransactions().get(0).getFragment(),
       is(fragment));
 }
 @Test
 public void shouldNotListenToContentChangesIfTestSubjectIsNotAnActivity() {
   Date testSubject = new Date();
   when(testCase.getTestSubjectClassType()).thenReturn(Date.class);
   when(injector.getInstance(Date.class)).thenReturn(testSubject);
   when(reflectionUtils.objectIsOfAnyType(testSubject, Activity.class)).thenReturn(false);
   testFieldInjector.setupTestCase();
   verify(injector, never()).getInstance(EventManager.class);
 }
 @Test
 public void shouldEnterIntoDummyActivityContextBeforeInjectingTestSubject() {
   when(testCase.getTestSubjectClassType()).thenReturn(Object.class);
   testFieldInjector.setupTestCase();
   InOrder inOrder = inOrder(roboUtils, injector);
   inOrder.verify(roboUtils).enterContext(any(FragmentActivity.class));
   inOrder.verify(roboUtils).getInjector(any(FragmentActivity.class));
   inOrder.verify(injector).getInstance(Object.class);
 }
 @Test
 public void shouldInjectActivityIntoTestCaseMarkedAsSubject()
     throws NoSuchFieldException, IllegalAccessException {
   when(testCase.getTestSubjectClassType()).thenReturn(Activity.class);
   when(testCase.getTestSubjectField()).thenReturn(getSampleField());
   when(testCase.getTestCaseInstance()).thenReturn(testCaseInstance);
   when(injector.getInstance(Activity.class)).thenReturn(activity);
   testFieldInjector.setupTestCase();
   verify(reflectionUtils).forceSetValueOnField(getSampleField(), testCaseInstance, activity);
 }
 @Test
 public void shouldCreateFragmentProxyWhenTestSubjectIsFragment() {
   when(testCase.getTestSubjectClassType()).thenReturn(RoboFragment.class);
   when(reflectionUtils.classIsOfAssignableForm(RoboFragment.class, RoboFragment.class))
       .thenReturn(true);
   when(reflectionUtils.createObjectProxy(RoboFragment.class, testFieldInjector))
       .thenReturn(fragment);
   testFieldInjector.setupTestCase();
   verify(reflectionUtils).createObjectProxy(RoboFragment.class, testFieldInjector);
 }
 @Test
 public void shouldListenToContentChangesIfTestSubjectIsAnActivity() {
   when(testCase.getTestSubjectClassType()).thenReturn(RoboActivity.class);
   when(injector.getInstance(RoboActivity.class)).thenReturn(activity);
   when(reflectionUtils.objectIsOfAnyType(activity, RoboActivity.class)).thenReturn(true);
   testFieldInjector.setupTestCase();
   verify(injector).getInstance(EventManager.class);
   verify(eventManager)
       .registerObserver(eq(OnContentChangedEvent.class), isA(ContentChangedListener.class));
 }
  @Test
  public void shouldEnterIntoTestSubjectContextIfTestSubjectIsAContext() {
    when(testCase.getTestSubjectClassType()).thenReturn(Activity.class);
    when(injector.getInstance(Activity.class)).thenReturn(activity);
    when(reflectionUtils.objectIsOfAnyType(activity, Context.class)).thenReturn(true);
    when(roboUtils.getInjector(activity)).thenReturn(injector);

    testFieldInjector.setupTestCase();
    verify(roboUtils).enterContext(activity);
  }
  @Test
  public void shouldGetTheInjectorForTheCurrentContextOnlyAfterEnteringCurrentContext() {
    when(testCase.getTestSubjectClassType()).thenReturn(Activity.class);
    when(injector.getInstance(Activity.class)).thenReturn(activity);
    when(reflectionUtils.objectIsOfAnyType(activity, Context.class)).thenReturn(true);
    when(roboUtils.getInjector(activity)).thenReturn(injector);

    testFieldInjector.setupTestCase();
    InOrder inOrder = inOrder(roboUtils);
    inOrder.verify(roboUtils).enterContext(activity);
    inOrder.verify(roboUtils).getInjector(activity);
  }
 @Test
 public void shouldInjectFragmentIntoTestCaseMarkedAsSubject()
     throws NoSuchFieldException, IllegalAccessException {
   when(testCase.getTestSubjectClassType()).thenReturn(RoboFragment.class);
   when(testCase.getTestSubjectField()).thenReturn(getSampleField());
   when(testCase.getTestCaseInstance()).thenReturn(testCaseInstance);
   when(reflectionUtils.classIsOfAssignableForm(RoboFragment.class, RoboFragment.class))
       .thenReturn(true);
   when(reflectionUtils.createObjectProxy(RoboFragment.class, testFieldInjector))
       .thenReturn(fragment);
   testFieldInjector.setupTestCase();
   verify(reflectionUtils).forceSetValueOnField(getSampleField(), testCaseInstance, fragment);
 }
 @Test
 public void shouldSetMocksIntoTestCase() throws NoSuchFieldException, IllegalAccessException {
   Object mockOne = mock(Object.class);
   Object mockTwo = mock(Object.class);
   when(testCase.getTestCaseInstance()).thenReturn(testCaseInstance);
   when(testCase.getFieldsMarkedWithMock())
       .thenReturn(Lists.newArrayList(getSampleField(), getSecondSampleField()));
   when(injector.getInstance(getSampleField().getType())).thenReturn(mockOne);
   when(injector.getInstance(getSecondSampleField().getType())).thenReturn(mockTwo);
   testFieldInjector.setupTestCase();
   verify(reflectionUtils).forceSetValueOnField(getSampleField(), testCaseInstance, mockOne);
   verify(reflectionUtils).forceSetValueOnField(getSecondSampleField(), testCaseInstance, mockTwo);
 }
 @Test
 public void shouldEnterIntoDummyContextIfTestSubjectIsNotAContext() {
   when(reflectionUtils.objectIsOfAnyType(any(), eq(Context.class))).thenReturn(false);
   testFieldInjector.setupTestCase();
   verify(roboUtils, times(2)).enterContext(any(FragmentActivity.class));
 }