@Test
  public void importMockInReusableVerificationBlock() {
    new ReusableExpectations() {};

    dependency.notifyBeforeSave();
    dependency.save();

    new ReusableVerifications() {};
  }
  @Test(expected = UnexpectedInvocation.class)
  public void verifyAllWithUnverifiedReplayOnSameInstance(final Dependency mock2) {
    mock.editABunchMoreStuff();
    mock2.editABunchMoreStuff();

    new FullVerifications(mock2) {
      {
        mock.editABunchMoreStuff();
      }
    };
  }
  @Test
  public void importMockFromReusableExpectationBlock() {
    new ReusableExpectations() {};

    dependency.notifyBeforeSave();
    dependency.save();

    new VerificationsInOrder() {
      Dependency dep;

      {
        dep.notifyBeforeSave();
        unverifiedInvocations();
      }
    };
  }
  @Test
  public void importLocalMocksFromPreviousExpectationsBlock() {
    Expectations exp =
        new Expectations() {
          @NonStrict Dependency mockDependency;

          @Mocked("run")
          @Capturing
          Runnable runnable;
        };

    dependency.editABunchMoreStuff();
    new Runnable() {
      public void run() {}
    }.run();

    new FullVerifications() {
      Runnable runnable;
      Dependency mock;

      {
        runnable.run();
        times = 1;
        mock.editABunchMoreStuff();
      }
    };
  }
  @Test
  public void verifyAllInvocationsToOnlyOneOfTwoMockedTypes(AnotherDependency mock2) {
    exerciseCodeUnderTest();
    mock2.doSomething();

    new FullVerifications(mock) {
      {
        mock.prepare();
        mock.setSomething(anyInt);
        minTimes = 1;
        maxTimes = 2;
        mock.editABunchMoreStuff();
        mock.save();
        times = 1;
      }
    };

    new FullVerifications(mock.getClass()) {
      {
        mock.prepare();
        mock.setSomething(anyInt);
        minTimes = 1;
        maxTimes = 2;
        mock.editABunchMoreStuff();
        mock.save();
        times = 1;
      }
    };
  }
  @Test
  public void verifyAllInvocationsToOneOfTwoMocksInIteratingBlock(AnotherDependency mock2) {
    mock2.doSomething();
    mock.setSomething(123);
    mock.save();
    mock2.doSomethingElse(1);
    mock.setSomething(45);
    mock.save();
    mock2.doSomethingElse(2);

    new FullVerifications(2, mock) {
      {
        mock.setSomething(anyInt);
        mock.save();
      }
    };
  }
  @Test(expected = MissingInvocation.class)
  public void verifyAllWithReplayOnDifferentInstanceWhenShouldBeSame(final Dependency mock2) {
    mock2.editABunchMoreStuff();

    new FullVerificationsInOrder(mock2) {
      {
        mock.editABunchMoreStuff();
      }
    };
  }
  @Test
  public void verifyAllInvocationsWithReplayOnSameInstance(final Dependency mock2) {
    mock2.editABunchMoreStuff();

    new FullVerifications(mock2) {
      {
        mock2.editABunchMoreStuff();
      }
    };
  }
  @Test(expected = UnexpectedInvocation.class)
  public void unverifiedStaticInvocationForSpecifiedSubclassInstance(final SubDependency mock2) {
    mock2.getValue();
    Dependency.staticMethod("test");

    new FullVerificationsInOrder(1, mock2) {
      {
        mock2.getValue();
      }
    };
  }
  @Test(expected = UnexpectedInvocation.class)
  public void verifyAllInvocationsToSubclassMethods_whenNotVerified(final SubDependency mock2) {
    mock.prepare();
    mock2.getValue();

    new FullVerificationsInOrder(1, mock2.getClass()) {
      {
        mock.prepare();
      }
    };
  }
  @Test
  public void verifyAllInvocationsToSubclassMethods(final SubDependency mock2) {
    mock.prepare();
    mock2.getValue();

    new FullVerifications(1, mock2.getClass()) {
      {
        mock2.getValue();
      }
    };
  }
  @Test
  public void verifyNoInvocationsOnOneOfTwoMockedDependenciesBeyondThoseRecordedAsExpected(
      final AnotherDependency mock2) {
    new NonStrictExpectations() {
      {
        mock.setSomething(anyInt);
        minTimes = 1;
        mock2.doSomething();
        times = 1;
      }
    };

    mock.prepare();
    mock.setSomething(1);
    mock.setSomething(2);
    mock.save();
    mock2.doSomething();

    new FullVerifications(mock2) {};
  }
  @Test(expected = UnexpectedInvocation.class)
  public void verifyAllInvocationsToMethodsOfBaseClassAndOfSubclass_whenSubclassMethodNotVerified(
      final SubDependency mock2) {
    mock.prepare();
    mock2.getValue();

    new FullVerifications(mock2) {
      {
        mock.prepare();
      }
    };
  }
  @Test
  public void verifyNoInvocationsOccurredOnMockedDependencyWithOneHavingOccurred(
      AnotherDependency mock2) {
    mock2.doSomething();
    mock.editABunchMoreStuff();

    try {
      new FullVerifications(mock) {};
      fail();
    } catch (UnexpectedInvocation e) {
      assertTrue(e.getMessage().contains("editABunchMoreStuff()"));
    }
  }
  @Test
  public void importLocalMockFromPreviousNonStrictExpectationsBlock() {
    new NonStrictExpectations() {
      Dependency mock;

      {
        mock.notifyBeforeSave();
        result = true;
      }
    };

    dependency.editABunchMoreStuff();
    assertTrue(dependency.notifyBeforeSave());

    new Verifications() {
      Dependency mock;

      {
        mock.editABunchMoreStuff();
      }
    };
  }
  @Test
  public void verifyAllInvocationsToInheritedMethods(SubDependency mock2) {
    mock.prepare();
    mock2.getValue();

    new FullVerificationsInOrder(1, mock) {
      {
        mock.prepare();
      }
    };
    new FullVerificationsInOrder(Dependency.class) {
      {
        mock.prepare();
      }
    };
  }
  @Test
  public void verifyStaticInvocationForSpecifiedMockInstance(final AnotherDependency mock2) {
    mock2.doSomething();
    AnotherDependency.staticMethod();
    mock2.doSomethingElse(1);
    mock.editABunchMoreStuff();
    mock2.doSomethingElse(2);

    new FullVerificationsInOrder(mock2) {
      {
        mock2.doSomething();
        AnotherDependency.staticMethod();
        mock2.doSomethingElse(anyInt);
        mock2.doSomethingElse(anyInt);
      }
    };
  }
 private static boolean isAnnotation(Dependency dependency) {
   return type(dependency.getTarget()).isAnnotation();
 }
 private static boolean self(Dependency dependency) {
   return dependency.getOrigin().getPackageName().equals(dependency.getTarget().getPackageName());
 }
 {
   mock.save();
   maxTimes = 1;
 }
 {
   mock.notifyBeforeSave();
   result = true;
 }
 private void exerciseCodeUnderTest() {
   mock.prepare();
   mock.setSomething(123);
   mock.editABunchMoreStuff();
   mock.save();
 }