@Test
  public void removeModelsLoadedByTheTemporaryEditingContextAfterTestExecution() throws Throwable {
    AbstractEditingContextRule editingContext = createEditingContext(TEST_MODEL_NAME);

    editingContext.before(mockTarget);
    editingContext.after(mockTarget);

    assertThat(EOModelGroup.defaultGroup().modelNamed(TEST_MODEL_NAME), nullValue());
  }
  @Test
  public void lockEditingContextBeforeRunningTheTestCase() throws Exception {
    AbstractEditingContextRule editingContext = spy(createEditingContext());

    verify(editingContext, times(0)).lock();

    editingContext.before(mockTarget);

    verify(editingContext, times(1)).lock();
  }
  @Test
  public void ensureEditingContextInitializationIsTriggeredBeforeTestExecution() throws Throwable {
    AbstractEditingContextRule editingContext = spy(createEditingContext(TEST_MODEL_NAME));

    InOrder inOrder = inOrder(editingContext, mockStatement);

    editingContext.apply(mockStatement, null, mockTarget).evaluate();

    inOrder.verify(editingContext).before(mockTarget);
    inOrder.verify(mockStatement).evaluate();
  }
  @Test
  public void disposeEditingContextAfterTestExecution() throws Throwable {
    AbstractEditingContextRule editingContext = Mockito.spy(createEditingContext(TEST_MODEL_NAME));

    editingContext.before(mockTarget);

    Mockito.verify(editingContext, Mockito.times(0)).dispose();

    editingContext.after(mockTarget);

    Mockito.verify(editingContext, Mockito.times(1)).dispose();
  }
  @Test
  @Ignore(value = "Revert may not be necessary")
  public void revertEditingContextChangesAfterRunningTheTestCases() throws Exception {
    AbstractEditingContextRule editingContext = spy(createEditingContext());

    editingContext.before(mockTarget);

    verify(editingContext, times(0)).revert();

    editingContext.after(mockTarget);

    verify(editingContext, times(1)).revert();
  }
  @Test
  public void doNotRemoveModelsNotLoadedByTheEditingContextRule() throws Throwable {
    URL url = getClass().getResource("/" + TEST_MODEL_NAME + ".eomodeld");

    EOModelGroup.defaultGroup().addModelWithPathURL(url);

    AbstractEditingContextRule editingContext = createEditingContext();

    editingContext.before(mockTarget);
    editingContext.after(mockTarget);

    assertThat(EOModelGroup.defaultGroup().modelNamed(TEST_MODEL_NAME), notNullValue());
  }
  @Test
  public void cannotCreateObjectUnderTestForNonEnterpriseObjectFields() throws Exception {
    AbstractEditingContextRule editingContext = createEditingContext(TEST_MODEL_NAME);

    WrongTypeForUnderTestStubTestCaseClass mockTarget =
        new WrongTypeForUnderTestStubTestCaseClass();

    thrown.expect(WOUnitException.class);
    thrown.expectMessage(
        is(
            "Cannot create object of type java.lang.String.\n Only fields of type com.webobjects.eocontrol.EOEnterpriseObject can be annotated with @UnderTest."));

    editingContext.before(mockTarget);
  }
  @Test
  @SuppressWarnings("unchecked")
  public void createAndInsertObjectForFieldAnnotatedWithUnderTest() throws Exception {
    AbstractEditingContextRule editingContext = createEditingContext(TEST_MODEL_NAME);

    StubTestCaseClass mockTestCase = new StubTestCaseClass();

    editingContext.before(mockTestCase);

    EOEnterpriseObject objectUnderTest = mockTestCase.objectUnderTest();

    assertThat(objectUnderTest, notNullValue());

    NSArray<EOEnterpriseObject> insertedObjects = editingContext.insertedObjects();

    assertThat(insertedObjects, hasItem(objectUnderTest));
  }
  @Test
  public void ensureEditingContextCleanUpIsTriggeredEvenIfTestExecutionThrowsException()
      throws Throwable {
    AbstractEditingContextRule editingContext = spy(createEditingContext(TEST_MODEL_NAME));

    doThrow(new Throwable("test error")).when(mockStatement).evaluate();

    InOrder inOrder = inOrder(editingContext, mockStatement);

    try {
      editingContext.apply(mockStatement, null, mockTarget).evaluate();
    } catch (Throwable exception) {
      // DO NOTHING
    } finally {
      inOrder.verify(mockStatement).evaluate();
      inOrder.verify(editingContext).after(mockTarget);
    }
  }
  @Test
  public void clearEditingContextChangesAfterTestExecution() throws Exception {
    AbstractEditingContextRule editingContext = createEditingContext(TEST_MODEL_NAME);

    editingContext.before(mockTarget);

    FooEntity foo = FooEntity.createFooEntity(editingContext);

    foo.setBar("test");

    editingContext.saveChanges();

    editingContext.after(mockTarget);

    editingContext = createEditingContext(TEST_MODEL_NAME);

    NSArray<FooEntity> result = FooEntity.fetchAllFooEntities(editingContext);

    assertThat(result.isEmpty(), is(true));
  }